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.
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ instanceof ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ,
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π»ΠΈ PHP-ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
ΠΡΠΈΠΌΠ΅Ρ #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. ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ, ΠΎΠ΄Π½Π°ΠΊΠΎ,
Π΄ΠΎ PHP 7.3.0 Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π»Π° ΡΠ°ΡΠ°Π»ΡΠ½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ.
ΠΡΠΈΠΌΠ΅Ρ #6 ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΠΈ ΠΊΠ»Π°ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π΄ΡΡΠ³ΠΈΡ
ΡΠΈΠΏΠΎΠ² ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ instanceof
<?php
$a = 1;
$b = NULL;
$c = fopen('/tmp/', 'r');
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 7.3.0 ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ Π² Π»Π΅Π²ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° instanceof ΡΡΠ°Π»ΠΈ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌΠΈ.
ΠΡΠΈΠΌΠ΅Ρ #7 ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΠΈ ΡΠΈΠΏΠ° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΠΊΠ»Π°ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ instanceof
<?php
var_dump(FALSE instanceof stdClass);
?>Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π² PHP 7.3:
bool(false)
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ PHP 8.0.0 ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ instanceof ΡΠ°Π·ΡΠ΅ΡΠΈΠ»ΠΈ
ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ: Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² ΠΊΡΡΠ³Π»ΡΡ
ΡΠΊΠΎΠ±ΠΊΠ°Ρ
ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠΈΠΏΠΎΠΌ string.
ΠΡΠΈΠΌΠ΅Ρ #8
ΠΡΠΈΠΌΠ΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° instanceof Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ
<?php
class ClassA extends \stdClass {}
class ClassB extends \stdClass {}
class ClassC extends ClassB {}
class ClassD extends ClassA {}
function getSomeClass(): string
{
return ClassA::class;
}
var_dump(new ClassA instanceof ('std' . 'Class'));
var_dump(new ClassB instanceof ('Class' . 'B'));
var_dump(new ClassC instanceof ('Class' . 'A'));
var_dump(new ClassD instanceof (getSomeClass()));
?>Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π² PHP 8:
bool(true) bool(true) bool(false) bool(true)
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ instanceof Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ΅Π½ ΡΡΠ½ΠΊΡΠΈΠΈ is_a().
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.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 );
?>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)if you have only class names (not objects) you can use that snippet: https://3v4l.org/mUKUC
<?php
interface i{}
class a implements i{}
var_dump(a::class instanceof i); // false
var_dump(in_array(i::class, class_implements(a::class), true)); // trueYou 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 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
?>Doing $a instanceof stdClass from inside a namespace will not work on its own.
You will have to do:
<?php
if ($a instanceof \stdClass)
?>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.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.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);
?>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().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]Using an undefined variable will result in an error.
If variable is in doubt, one must prequalify:
if ( isset( $MyInstance ) and $MyInstance instanceof MyClass ) ...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));
}
?>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 isMemberOfThe 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 illegalPlease 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?