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

search for in the

Estruturas de Controle> <Operadores de Arrays
[edit] Last updated: Fri, 26 Apr 2013

view this page in

Operadores de tipo

instanceof é usado para determinar se um variável do PHP é uma objeto instânciado de uma certa classe:

Exemplo #1 Usando instanceof com classes

<?php
class MyClass
{
}

class 
NotMyClass
{
}
$a = new MyClass;

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

O exemplo acima irá imprimir:

bool(true)
bool(false)

instanceof pode também ser usado para determinar se uma variável é um objeto instânciado de uma classe que herda de uma classe pai:

Exemplo #2 Usando instanceof com herança

<?php
class ParentClass
{
}

class 
MyClass extends ParentClass
{
}

$a = new MyClass;

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

O exemplo acima irá imprimir:

bool(true)
bool(true)

Para verificar se um objeto não é uma instância de uma classe, o operador lógico not pode ser usado.

Exemplo #3 Usando instanceof para verificar se o objeto não é uma instância da classe

<?php
class MyClass
{
}

$a = new MyClass;
var_dump(!($a instanceof stdClass));
?>

O exemplo acima irá imprimir:

bool(true)

Por fim, instanceof pode também ser usado para determinar se uma variável é um objeto instânciado de uma classe que implementa uma interface:

Exemplo #4 Usando instanceof para classe

<?php
interface MyInterface
{
}

class 
MyClass implements MyInterface
{
}

$a = new MyClass;

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

O exemplo acima irá imprimir:

bool(true)
bool(true)

Embora instanceof é usualmente usado com um nome de classe literal, ele pode também ser usado com outro objeto ou uma variável string:

Exemplo #5 Usando instanceof com outras variáveis

<?php
interface MyInterface
{
}

class 
MyClass implements MyInterface
{
}

$a = new MyClass;
$b = new MyClass;
$c 'MyClass';
$d 'NotMyClass';

var_dump($a instanceof $b); // $b é umn objeto da classe MyClass
var_dump($a instanceof $c); // $c é uma string 'MyClass'
var_dump($a instanceof $d); // $d é uma string 'NotMyClass'
?>

O exemplo acima irá imprimir:

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

Há algumas detalhes para estar ciente. Antes do PHP 5.1.0, instanceof podia chamar __autoload() quando o nome da classe não existe. Em adicional, se a classe não foi carregada, um erro fatal poderia ocorrer. Isto pode funcionar usando a dynamic class reference, ou uma variável string contendo o nome da classe:

Exemplo #6 Evitando que o nome da classe seje verificado e fatal erros com instanceof no PHP 5.0

<?php
$d 
'NotMyClass';
var_dump($a instanceof $d); // não causa erro fatal
?>

O exemplo acima irá imprimir:

bool(false)

O operador instanceof foi introduzido no PHP 5. Antes disso is_a() era usado mas is_a() tornou-se obsoleto pelo instanceof.

Veja também get_class() e is_a().



Estruturas de Controle> <Operadores de Arrays
[edit] Last updated: Fri, 26 Apr 2013
 
add a note add a note User Contributed Notes Operadores de tipo - [20 notes]
up
1
julien plee using g mail dot com
5 years ago
Response to vinyanov at poczta dot onet dot pl:

You mentionned "the instanceof operator will not accept a string as its first operand". However, this behavior is absolutely right and therefore, you're misleading the meaning of an instance.

<?php 'ClassA' instanceof 'ClassB'; ?> means "the class named ClassA is an instance of the class named ClassB". This is a nonsense sentence because when you instanciate a class, you ALWAYS obtain an object. Consequently, you only can ask if an object is an instance of a class.

I believe asking if "a ClassA belongs to a ClassB" (or "a ClassA is a class of (type) ClassB") or even "a ClassA is (also) a ClassB" is more appropriate. But the first is not implemented and the second only works with objects, just like the instanceof operator.

Plus, I just have tested your code and it does absolutely NOT do the same as instanceof (extended to classes)! I can't advise anyone to reuse it. The use of <?php is_instance_of ($instanceOfA, 'ClassB'); ?> raises a warning "include_once(Object id #1.php) …" when using __autoload (trying to look for $instanceOfA as if it was a class name).

Finally, here is a fast (to me) sample function code to verify if an object or class:

<?php
function kind_of (&$object_or_class, $class)
{
    return
is_object ($object_or_class) ?
       
$object_or_class instanceof $class
       
: (is_subclass_of ($object_or_class $class)
           ||
strtolower ($object_or_class) == strtolower ($class));
}
?>
up
2
fbableus
2 years ago
If you want to test if a classname is an instance of a class, the instanceof operator won't work.

<?php
$classname
= 'MyClass';
if(
$classname instanceof MyParentClass) echo 'Child of it';
else echo
'Not child of it';
?>

Will always output
Not child of it

You must use a ReflectionClass :
<?php
$classname
= 'MyClass';
$myReflection = new ReflectionClass($classname);
if(
$myReflection->isSubclassOf('MyParentClass')) echo  'Child of it';
else echo
'Not child of it';
?>

Will output the good result.
If you're testing an interface, use implementsInterface() instead of isSublassOf().
up
2
jtaal at eljakim dot nl
4 years ago
You can use "self" to reference to the current class:

<?php
class myclass {
    function
mymethod($otherObject) {
        if (
$otherObject instanceof self) {
           
$otherObject->mymethod(null);
        }
        return
'works!';
    }
}

$a = new myclass();
print
$a->mymethod($a);
?>
up
1
Sudarshan Wadkar
1 year ago
I don't see any mention of "namespaces" on this page so I thought I would chime in. The instanceof operator takes FQCN as second operator when you pass it as string and not a simple class name. It will not resolve it even if you have a `use MyNamespace\Bar;` at the top level. Here is what I am trying to say:

## testinclude.php ##
<?php
namespace Bar1;
{
class
Foo1{ }
}
namespace
Bar2;
{
class
Foo2{ }
}
?>
## test.php ##
<?php
include('testinclude.php');
use
Bar1\Foo1 as Foo;
$foo1 = new Foo(); $className = 'Bar1\Foo1';
var_dump($foo1 instanceof Bar1\Foo1);
var_dump($foo1 instanceof $className);
$className = 'Foo';
var_dump($foo1 instanceof $className);
use
Bar2\Foo2;
$foo2 = new Foo2(); $className = 'Bar2\Foo2';
var_dump($foo2 instanceof Bar2\Foo2);
var_dump($foo2 instanceof $className);
$className = 'Foo2';
var_dump($foo2 instanceof $className);
?>
## stdout ##
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)
up
0
wbcarts at juno dot com
11 months ago
SIMPLE, CLEAN, CLEAR use of the instanceof OPERATOR

First, define a couple of simple PHP Objects to work on -- I'll introduce Circle and Point. Here's the class definitions for both:

<?php

class Circle
{
  protected
$radius = 1.0;

 
/*
   * This function is the reason we are going to use the
   * instanceof operator below.
   */
 
public function setRadius($r)
  {
   
$this->radius = $r;
  }

  public function
__toString()
  {
    return
'Circle [radius=' . $this->radius . ']';
  }
}

class
Point
{
  protected
$x = 0;
  protected
$y = 0;

 
/*
   * This function is the reason we are going to use the
   * instanceof operator below.
   */
 
public function setLocation($x, $y)
  {
   
$this->x = $x;
   
$this->y = $y;
  }

  public function
__toString()
  {
    return
'Point [x=' . $this->x . ', y=' . $this->y . ']';
  }
}

?>

Now instantiate a few instances of these types. Note, I will put them in an array (collection) so we can iterate through them quickly.

<?php

$myCollection
= array(123, 'abc', 'Hello World!',
  new
Circle(), new Circle(), new Circle(),
  new
Point(), new Point(), new Point());

$i = 0;
foreach(
$myCollection AS $item)
{
 
/*
   * The setRadius() function is written in the Circle class
   * definition above, so make sure $item is an instance of
   * type Circle BEFORE calling it AND to avoid PHP PMS!
   */
 
if($item instanceof Circle)
  {
   
$item->setRadius($i);
  }

 
/*
   * The setLocation() function is written in the Point class
   * definition above, so make sure $item is an instance of
   * type Point BEFORE calling it AND to stay out of the ER!
   */
 
if($item instanceof Point)
  {
   
$item->setLocation($i, $i);
  }

  echo
'$myCollection[' . $i++ . '] = ' . $item . '<br>';
}

?>

$myCollection[0] = 123
$myCollection[1] = abc
$myCollection[2] = Hello World!
$myCollection[3] = Circle [radius=3]
$myCollection[4] = Circle [radius=4]
$myCollection[5] = Circle [radius=5]
$myCollection[6] = Point [x=6, y=6]
$myCollection[7] = Point [x=7, y=7]
$myCollection[8] = Point [x=8, y=8]
up
0
mauritsdajong at gmail dot com
2 years ago
Sometimes you want to typehint objects INSIDE an array, but I think you can't.

Instead, you can use this function to check the classes inside this array:

<?php

public checkObjectsArray(array $array, $classname, $strict = false) {
    if (!
$strict) {
        foreach (
$array as $element) {
            if (!(
$element instanceof $classname)) {
                return
false;
            }
        }
    }
    else {
        foreach (
$array as $element) {
            if (
get_class($element) != $classname) {
                return
false;
            }
        }
    }
    return
true;
}

?>
up
0
phil dot taylor at gmail dot com
2 years ago
It seems like instanceOf is using a string comparison. Longer class names take longer to check in conditional statements

eg.

if ($f instanceOf HelloWorldTestClass)

is much slower than

if ($f instanceOf HWT)
up
0
kevin dot benton at beatport dot com
4 years ago
Example #5 could also be extended to include...

var_dump($a instanceof MyInterface);

The new result would be

bool(true)

So - instanceof is smart enough to know that a class that implements an interface is an instance of the interface, not just the class.  I didn't see that point made clearly enough in the explanation at the top.
up
0
jphaas at gmail dot com
5 years ago
Posting this so the word typeof appears on this page, so that this page will show up when you google 'php typeof'.  ...yeah, former Java user.
up
0
soletan at toxa dot de
6 years ago
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?
up
0
knarlin at yahoo dot com dot au
2 months ago
Checking an object is not an instance of a class, example #3 uses extraneous parentheses.

<?php
var_dump
(!($a instanceof stdClass));
?>

Because instanceof has higher operator precedence than ! you can just do

<?php
var_dump
( ! $a instanceof stdClass );
?>
up
0
ejohnson82 at gmail dot com
5 years ago
The PHP parser generates a parse error on either of the two lines that are commented out here. 
Apparently the 'instanceof' construct will take a string variable in the second spot, but it will NOT take a string... lame

class Bar {}
$b = new Bar;
$b_class = "Bar";
var_export($b instanceof Bar); // this is ok
var_export($b instanceof $b_class); // this is ok
//var_export($f instanceof "Bar"); // this is syntactically illegal
//var_export($f instanceof 'Bar'); // this is syntactically illegal
up
0
vinyanov at poczta dot onet dot pl
5 years ago
Unfortunately the instanceof operator will not accept a string as its first operand. So I wrote this function. It does exactly the same (ie, successively checks identicalness, inheritance and implementation). Just on strings.

<?php

function is_instance_of($sub, $super)
{
   
$sub = (string)$sub;
   
$super = is_object($super) ? get_class($super) : (string)$super;
   
    switch(
true)
    {
        case
$sub === $super; // well ... conformity
       
case is_subclass_of($sub, $super):
        case
in_array($super, class_implements($sub)):
            return
true;
        default:
            return
false;
    }
}

// testing

interface X {}
class
A {}
class
B extends A {}
class
C extends B {}
class
D implements X {}

$i = 'is_instance_of';
var_dump($i('A', 'A'), $i('B', 'A'), $i('C', 'A'), $i('D', 'X'));

?>
up
0
jeanyves dot terrien at orange-ftgroup dot com
6 years ago
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
up
0
archanglmr at yahoo dot com
8 years ago
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');
}
?>
up
0
d dot schneider at 24you dot de
8 years ago
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;
        }
    }

?>
up
-1
jmullee at yahoo dot com
2 years ago
returns true for any ancestor class, not just immediate superclasses.

php -r "class Mammal{}; class Primate extends Mammal {}; class Human extends Primate{}; \$h=new Human(); echo (\$h instanceof Mammal)?'Yes':'no';"

Yes
up
-1
Jennifer
2 years ago
I was getting frustrated by instanceof not taking a string for its first argument so I wrote this function that takes strings or objects for both args and deals with both classes and interfaces.  I hope it's useful to someone.

<?php
/**
 * @desc: replacement for instanceof that accept strings or objects for both args
 * @param: Mixed $object- string or Object
 * @param: Mixed $class- string or Object
 * @return: Boolean
 */
function oneof($object, $class){
    if(
is_object($object)) return $object instanceof $class;
    if(
is_string($object)){
        if(
is_object($class)) $class=get_class($class);

        if(
class_exists($class)) return is_subclass_of($object, $class) || $object==$class;
        if(
interface_exists($class)) {
           
$reflect = new ReflectionClass($object);
            return !
$reflect->implementsInterface($class);
        }

    }
    return
false;
}
?>
up
-2
carloagonzales at gmail dot com
6 months ago
When checking if the an object of an unknown type is an instance of the class within its implementation and using magic constant __CLASS__ make sure to put the value of __CLASS__ to a variable first, before using instanceof.

<?php

/**
* RIGHT WAY to determine class instance in a class method
*/
class TestClass {
  
//static or what ever you prefer
  
static function isClassInstance($variableWithUnknownClass){
      return
$variableWithUnknownClass instanceof __CLASS__;
   }
}

//Returns TRUE
$object = new TestClass();
var_dump(TestClass::isClassInstance($object));

//Returns FALSE
$object = new stdClass();
var_dump(TestClass::isClassInstance($object));

/**
* WRONG WAY to determine class instance in a class method
* RESULTS to a FATAL ERROR
*/
class TestClass {
  
//static or what ever you prefer
  
static function isClassInstance($variableWithUnknownClass){
      return
$variableWithUnknownClass instanceof __CLASS__;
   }
}

?>
up
-2
mikael dot knutsson at gmail dot com
6 years ago
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!

 
show source | credits | stats | sitemap | contact | advertising | mirror sites