PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Control Structures> <Array Operators
Last updated: Fri, 01 Jun 2007

view this page in

Type Operators

instanceof is used to determine whether a PHP variable is an instantiated object of a certain class:

Example 15.8. Using instanceof with classes

<?php
class MyClass
{
}
class
NotMyClass
{
}
$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);
?>

The above example will output:


bool(true)
bool(false)

     

instanceof can also be used to determine whether a variable is an instantiated object of a class that inherits from a parent class:

Example 15.9. Using instanceof with inherited classes

<?php
class ParentClass
{
}
class
MyClass extends ParentClass
{
}
$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof ParentClass);
?>

The above example will output:


bool(true)
bool(true)

     

Lastly, instanceof can also be used to determine whether a variable is an instantiated object of a class that implements an interface:

Example 15.10. Using instanceof for class

<?php
interface MyInterface
{
}
class
MyClass implements MyInterface
{
}
$a = new MyClass;

var_dump($a instanceof MyClass);
var_dump($a instanceof MyInterface);
?>

The above example will output:


bool(true)
bool(true)

     

Although instanceof is usually used with a literal classname, it can also be used with another object or a string variable:

Example 15.11. Using instanceof with other variables

<?php
interface MyInterface
{
}
class
MyClass implements MyInterface
{
}
$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';
var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'
?>

The above example will output:


bool(true)
bool(true)
bool(false)

     

There are a few pitfalls to be aware of. Before PHP version 5.1.0, instanceof would call __autoload() if the class name did not exist. In addition, if the class was not loaded, a fatal error would occur. This can be worked around by using a dynamic class reference, or a string variable containing the class name:

Example 15.12. Avoiding classname lookups and fatal errors with instanceof in PHP 5.0

<?php
$d
= 'NotMyClass';
var_dump($a instanceof $d); // no fatal error here
?>

The above example will output:


bool(false)

     

The instanceof operator was introduced in PHP 5. Before this time is_a() was used but is_a() has since been deprecated in favor of instanceof.

See also get_class() and is_a().



add a note add a note User Contributed Notes
Type Operators
jeanyves dot terrien at orange-ftgroup dot com
13-Mar-2007 08:34
Cross version function even if you are working in php4
(instanceof is an undefined operator for php4)

   function isMemberOf($classename) {
      $ver = floor(phpversion());
      if($ver > 4) {
         $instanceof = create_function ('$obj,$classname','return $obj instanceof $classname;');
         return $instanceof($this,$classname);
      } else {
         // Php4 uses lowercase for classname.
         return is_a($this, strtolower($classname));
      }
   } // end function isMemberOf
soletan at toxa dot de
03-Mar-2007 12:04
Please note: != is a separate operator with separate semantics. Thinking about language grammar it's kind of ridicilous to negate an operator. Of course, it's possible to negate the result of a function (like is_a()), since it isn't negating the function itself or its semantics.

instanceof is a binary operator, and so used in binary terms like this

terma instanceof termb

while ! (negation) is a unary operator and so may be applied to a single term like this

!term

And a term never consists of an operator, only! There is no such construct in any language (please correct me!). However, instanceof doesn't finally support nested terms in every operand position ("terma" or "termb" above) as negation does:

!!!!!!!!!!!!!!term == term

So back again, did you ever write

a !!!!!!!!!!!!= b

to test equivalence?
mikael dot knutsson at gmail dot com
06-Dec-2006 04:34
I can confirm what thisbizness at gmail dot com said just below in PHP 5.2, furthermore, people looking to use this as a "if $a is not instance of A" for error throwing purposes or other, just type it like this:
<?php
if( !$a instanceof A ) {
    throw new
Exception( '$a is not instance of A.' );
}
?>

This also works if $a is not an object, or not even set (you will get an E_NOTICE if it isn't set though).
A note worth making is that if you are unsure of if class A is present when making this comparison, and you don't want to trigger the __autoload() magic method, scroll down for examples of how to get around this.

I was unsure about it at first since most other operators have their own negative (like !=) or they are/can be used as function calls (like !is_a()) but it is this simple. Hope it helps someone.

Until again!
archanglmr at yahoo dot com
18-Feb-2005 02:37
Negated instanceof doesn't seem to be documented. When I read instanceof I think of it as a compairson operator (which I suppose it's not).

<?php
class A {}
class
X {}

//parse error from !
if (new X !instanceof A) {
    throw new
Exception('X is not an A');
}
//proper way to negate instanceof ?
if (!(new X instanceof A)) {
    throw new
Exception('X is not an A');
}
?>
d dot schneider at 24you dot de
18-Dec-2004 08:42
use this for cross-version development...

<?php

function is_instance_of($IIO_INSTANCE, $IIO_CLASS){
    if(
floor(phpversion()) > 4){
        if(
$IIO_INSTANCE instanceof $IIO_CLASS){
            return
true;
            }
        else{
            return
false;
            }
        }
    elseif(
floor(phpversion()) > 3){
        return
is_a($IIO_INSTANCE, $IIO_CLASS);
        }
    else{
        return
false;
        }
    }

?>

Control Structures> <Array Operators
Last updated: Fri, 01 Jun 2007
 
 
show source | credits | sitemap | contact | advertising | mirror sites