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

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

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


Наша группа в телеграмм для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov
class MyClass
{
}
class NotMyClass
{
}
$a = new MyClass;
var_dump($a instanceof MyClass);
var_dump($a instanceof NotMyClass);

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


bool(true)
bool(false)

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

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

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 для проверки того, что объект не является экземпляром класса

class MyClass
{
}
$a = new MyClass;
var_dump(!($a instanceof stdClass));

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


bool(true)

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

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

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 с другими переменными

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 для проверки других переменных

$a = 1;
$b = NULL;
$c = imagecreate(5, 5);
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

$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().


User Contributed Notes 17 notes



3
knarlin at yahoo dot com dot au9 months ago
var_dump(!($a instanceof stdClass));


3
Sudarshan Wadkar1 year ago
namespace Bar1;
{
class Foo1{ }
}
namespace Bar2;
{
class Foo2{ }
}


2
fbableus2 years ago
$classname = 'MyClass';
if( $classname instanceof MyParentClass) echo 'Child of it';
else echo 'Not child of it';


2
jtaal at eljakim dot nl5 years ago
class myclass {
    function mymethod($otherObject) {
        if ($otherObject instanceof self) {
            $otherObject->mymethod(null);
        }
        return 'works!';
    }
}
$a = new myclass();
print $a->mymethod($a);


1
phil dot taylor at gmail dot com3 years ago
'ClassA' instanceof 'ClassB';


1
jphaas at gmail dot com6 years ago
class A { }
class B { }
$a = new A;
$b = new B;
$a2 = new A;
echo $a instanceOf $a; // true
echo $a instanceOf $b; // false
echo $a instanceOf $a2; // true


0
info at pkrules dot in1 month ago
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');


0
wbcarts at juno dot com1 year ago
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 . ']';
  }
}


0
mauritsdajong at gmail dot com3 years ago
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;
}


0
kevin dot benton at beatport dot com5 years ago
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');
}


0
d dot schneider at 24you dot de8 years ago
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;
        }
    }




Смотрите также:
Описание на ru2.php.net
Описание на php.ru

.

Популярное:


Содержание: