PHP 7.0.6 Released

INSTANCEOF

PHP code

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

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

PHP opcodes

Function name: (null)

Compiled variables: !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

User Contributed Notes

cody at codysnider dot com
3 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)
krall dot eugene at gmail dot com
1 year 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
portugal {at} jawira {dot} com
10 months 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
asdf at asdf dot com
4 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
admin at torntech dot com
1 year 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