INSTANCEOF

PHP コード

<?php
/*
 * 
 * opcode number: 138
 */
$obj = new A();

if (
$obj instanceof A) {
   echo 
'A';
}
?>

PHP オペコード

関数名: (null)

コンパイルされた変数: !0=$obj

line#op fetchextreturn operands
60 ZEND_FETCH_CLASS   :0 'A'
 1 NEW   $1 :0
 2 DO_FCALL_BY_NAME  0   
 3 ASSIGN     !0,$1
84 ZEND_FETCH_CLASS   :4 'A'
 5 ZEND_INSTANCEOF   ~5 !0,$4
 6 JMPZ     ~5,->9
97 ECHO     'A'
108 JMP     ->9
119 RETURN     1
add a note add a note

User Contributed Notes 6 notes

up
56
cody at codysnider dot com
12 years ago
When checking instanceof against a subclass of the class in question, it will return true.

<?php

class Foo {

    public
$foobar = 'Foo';
   
    public function
test() {
        echo
$this->foobar . "\n";
    }

}

class
Bar extends Foo {

    public
$foobar = 'Bar';

}

$a = new Foo();
$b = new Bar();

echo
"use of test() method\n";
$a->test();
$b->test();

echo
"instanceof Foo\n";
var_dump($a instanceof Foo); // TRUE
var_dump($b instanceof Foo); // TRUE

echo "instanceof Bar\n";
var_dump($a instanceof Bar); // FALSE
var_dump($b instanceof Bar); // TRUE

echo "subclass of Foo\n";
var_dump(is_subclass_of($a, 'Foo')); // FALSE
var_dump(is_subclass_of($b, 'Foo')); // TRUE

echo "subclass of Bar\n";
var_dump(is_subclass_of($a, 'Bar')); // FALSE
var_dump(is_subclass_of($b, 'Bar')); // FALSE

?>

Result (CLI, 5.4.4):

use of test() method
Foo
Bar
instanceof Foo
bool(true)
bool(true)
instanceof Bar
bool(false)
bool(true)
subclass of Foo
bool(false)
bool(true)
subclass of Bar
bool(false)
bool(false)
up
12
krall dot eugene at gmail dot com
9 years ago
When checking instanceof against a class that implements the class in question, it will return true.

<?php

interface ExampleInterface
{
    public function
interfaceMethod();

}

class
ExampleClass implements ExampleInterface
{
    public function
interfaceMethod()
    {
        return
'Hello World!';
    }
}

$exampleInstance = new ExampleClass();

if(
$exampleInstance instanceof ExampleInterface)
    echo
'Yes, it is';
else
    echo
'No, it is not';

?>

The result:

Yes, it is
up
12
portugal {at} jawira {dot} com
9 years ago
I'm commenting here because the note from "admin at torntech" is incomplete. You can perfectly replace "is_a()" function with "instanceof" operator. However you must use a variable to store the class name, otherwise you will get a Parse error:

<?php
$object
= new \stdClass();
$class_name = '\stdClass';

var_dump($object instanceof $class_name);    // bool(true)
var_dump($object instanceof '\stdClass');    // Parse error: syntax error, unexpected ''\stdClass'' (T_CONSTANT_ENCAPSED_STRING)
?>

Please go to Type Operators page for more details about "instanceof": http://php.net/manual/en/language.operators.type.php
up
20
asdf at asdf dot com
12 years ago
Please note, that you get no warnings on non-existent classes:

<?php
class A() {
}

$a = new A();

$exists = ($a instanceof A); //TRUE
$exists = ($a instanceof NonExistentClass); //FALSE
up
5
katrinaelaine6 at gmail dot com
7 years ago
instanceof also works on abstract classes and interfaces.

<?php

abstract class Grandpa {}
interface
Father {}
interface
Son {}

class
Base extends Grandpa implements Father {}
class
Child extends Base implements Son {}

$b = new Base();
$c = new Child();

/* All of the following are true. */

var_dump($b instanceof Grandpa);
var_dump($b instanceof Father);

var_dump($c instanceof Son);
var_dump($c instanceof Father);
var_dump($c instanceof Grandpa);

?>
up
-5
admin at torntech dot com
9 years ago
Despite this section being opcode examples, for php 5.3+ see also is_a()
*Note php 5.0 - 5.2 is_a() was depreciated in favor of instanceof but was undepreciated in 5.3+.

Allows for string comparison against the class name and functions in the same manner as cody mentions like so.
<?php
namespace Foo{
    class
Bar {}
    class
Baz extends Bar{}
}
namespace {
   
$baz = new Foo\Baz;

   
var_dump($baz instanceof Foo\Bar);
   
/* returns bool(true) */

   
var_dump(is_a($baz, 'Foo\\Bar'));
   
/* returns bool(true) */

   
var_dump($baz instanceof 'Foo\\Bar');
   
/* returns Runtime parse error */
}
?>
To Top