Оператор проверки типа

Оператор instanceof используется для определения того, является ли текущий объект экземпляром указанного класса.

Пример #1 Использование instanceof с классами

<?php
class MyClass
{
}

class 
NotMyClass
{
}
$a = new MyClass;

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

Результат выполнения данного примера:

bool(true)
bool(false)

Оператор instanceof также может быть использован для определения, наследует ли определенный объект какому-либо классу:

Пример #2 Использование instanceof с наследуемыми классами

<?php
class ParentClass
{
}

class 
MyClass extends ParentClass
{
}

$a = new MyClass;

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

Результат выполнения данного примера:

bool(true)
bool(true)

Для проверки непринадлежности объекта некоторому классу, используйте логический оператор not.

Пример #3 Использование instanceof для проверки того, что объект не является экземпляром класса

<?php
class MyClass
{
}

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

Результат выполнения данного примера:

bool(true)

Ну и наконец, instanceof может быть также использован для проверки реализации объектом некоторого интерфейса:

Пример #4 Использование instanceof для класса

<?php
interface MyInterface
{
}

class 
MyClass implements MyInterface
{
}

$a = new MyClass;

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

Результат выполнения данного примера:

bool(true)
bool(true)

Хотя instanceof обычно используется с прямо указанным именем класса, он также может быть использован с другим объектом или строковой переменной:

Пример #5 Использование instanceof с другими переменными

<?php
interface MyInterface
{
}

class 
MyClass implements MyInterface
{
}

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

var_dump($a instanceof $b); // $b это объект класса MyClass
var_dump($a instanceof $c); // $c это строка 'MyClass'
var_dump($a instanceof $d); // $d это строка 'NotMyClass'
?>

Результат выполнения данного примера:

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

Оператор instanceof не генерирует никаких ошибок, если проверяемая переменная не является объектом. В этом случае он просто возвращает FALSE. Константы, тем не менее, не допускаются.

Пример #6 Пример использования оператора instanceof для проверки других переменных

<?php
$a 
1;
$b NULL;
$c imagecreate(55);
var_dump($a instanceof stdClass); // $a это целое типа integer
var_dump($b instanceof stdClass); // $b это NULL
var_dump($c instanceof stdClass); // $c это значение типа resource
var_dump(FALSE instanceof stdClass);
?>

Результат выполнения данного примера:

bool(false)
bool(false)
bool(false)
PHP Fatal error:  instanceof expects an object instance, constant given

Есть несколько подводных камней, которых следует остерегаться. До версии PHP 5.1.0, instanceof вызывал __autoload() если имя класса не существовало. Вдобавок, если класс не был загружен, происходила фатальная ошибка. Это можно было обойти с помощью динамической ссылки на класс или использования строковой переменной с именем класса:

Пример #7 Избежание поиска класса и фатальных ошибок с instanceof в PHP 5.0

<?php
$d 
'NotMyClass';
var_dump($a instanceof $d); // нет фатальной ошибки
?>

Результат выполнения данного примера:

bool(false)

Оператор instanceof был добавлен в PHP 5. До этого времени использовалась функция is_a(), но позже is_a() была помечена устаревшей в пользу instanceof. Учтите, что с версии PHP 5.3.0, is_a() больше не является устаревшей.

Ознакомьтесь также с описанием функций get_class() и is_a().

Коментарии

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;
        }
    }

?>
2004-12-18 14:42:15
http://php5.kiev.ua/manual/ru/language.operators.type.html
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 {}
class 
{}

//parse error from !
if (new !instanceof A) {
    throw new 
Exception('X is not an A');
}
//proper way to negate instanceof ?
if (!(new instanceof A)) {
    throw new 
Exception('X is not an A');
}
?>
2005-02-17 20:37:48
http://php5.kiev.ua/manual/ru/language.operators.type.html
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?
2007-03-03 06:04:05
http://php5.kiev.ua/manual/ru/language.operators.type.html
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
2007-03-13 02:34:54
http://php5.kiev.ua/manual/ru/language.operators.type.html
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.
2007-07-11 13:50:21
http://php5.kiev.ua/manual/ru/language.operators.type.html
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));

?>
2007-07-20 21:56:41
http://php5.kiev.ua/manual/ru/language.operators.type.html
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
2008-01-18 15:59:31
http://php5.kiev.ua/manual/ru/language.operators.type.html
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.
2008-08-21 12:31:17
http://php5.kiev.ua/manual/ru/language.operators.type.html
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);
?>
2008-11-17 07:37:39
http://php5.kiev.ua/manual/ru/language.operators.type.html
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)
2010-07-15 19:13:57
http://php5.kiev.ua/manual/ru/language.operators.type.html
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;
}

?>
2010-08-13 18:38:06
http://php5.kiev.ua/manual/ru/language.operators.type.html
Автор:
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().
2011-03-18 08:05:34
http://php5.kiev.ua/manual/ru/language.operators.type.html
Автор:
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 
Bar1Foo1 as Foo;
$foo1 = new Foo(); $className 'Bar1\Foo1';
var_dump($foo1 instanceof Bar1Foo1);
var_dump($foo1 instanceof $className);
$className 'Foo';
var_dump($foo1 instanceof $className);
use 
Bar2Foo2;
$foo2 = new Foo2(); $className 'Bar2\Foo2';
var_dump($foo2 instanceof Bar2Foo2);
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)
2011-12-15 06:34:33
http://php5.kiev.ua/manual/ru/language.operators.type.html
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;
   
$this->$y;
  }

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

?>

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]
2012-05-18 05:14:48
http://php5.kiev.ua/manual/ru/language.operators.type.html
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 );
?>
2013-03-01 01:23:35
http://php5.kiev.ua/manual/ru/language.operators.type.html
use this to check instance of or you can add the else part inside the if making it nested if for dual varification.:-
<?php
class MyClass{}
class 
Test extends MyClass{
public function 
checkObjectArray(array $array,$classname,$strict=false){
if(!
$strict){
foreach(
$array as $element){
 if(!(
$element instanceOf $classname)){//we can use typehint objects
INSIDE an array
 echo 
"false";
 echo 
"<br />";
 break;
 }
 else{
 print 
"<br />true (if)";
 }
}
}
else{
foreach(
$array as $element){
if(
get_class($element)!=$classname){// or we can use this function to
check the classes inside this array
echo 
"false (else)";
}
}
}
echo 
"<br />true";
}
}
$ob=new Test;

$a=new MyClass();
$array=array($a);
$ob->checkObjectArray($array,'MyClass');
?>
2013-10-29 13:08:10
http://php5.kiev.ua/manual/ru/language.operators.type.html
Автор:
You are also able to compare 2 objects using instanceOf. In that case, instanceOf will compare the types of both objects. That is sometimes very useful:

<?php

class { }
class 
{ }

$a = new A;
$b = new B;
$a2 = new A;

echo 
$a instanceOf $a// true
echo $a instanceOf $b// false
echo $a instanceOf $a2// true

?>
2013-12-11 19:52:05
http://php5.kiev.ua/manual/ru/language.operators.type.html
Автор:
You can use instanceof also for interfaces.
2014-01-15 16:00:16
http://php5.kiev.ua/manual/ru/language.operators.type.html
Doing $a instanceof stdClass from inside a namespace will not work on its own. 

You will have to do:

<?php
if ($a instanceof stdClass
?>
2017-07-29 23:41:28
http://php5.kiev.ua/manual/ru/language.operators.type.html
Автор:
If you want to use "$foo instanceof $bar" to determine if two objects are the same class, remember that "instanceof" will also evaluate to true if $foo is an instance of a _subclass_ of $bar's class.

If you really want to see if they are the _same_ class, then they both have to be instances of each other's class. That is:
<?php

($foo instanceof $bar && $bar instanceof $foo)

?>

Consider it an alternative to "get_class($bar) == get_class($foo)" that avoids the detour through to string lookups and comparisons.
2017-11-05 01:39:43
http://php5.kiev.ua/manual/ru/language.operators.type.html

    Поддержать сайт на родительском проекте КГБ