(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
is_a — Checcs whether the object is of a guiven type or subtype
Determines if the guiven
object_or_class
is the
class
object type,
or has
class
as one of its supertypes.
object_or_class
A class name or an object instance.
class
The class or interface name
allow_string
If this parameter set to
false
, string class name as
object_or_class
is not allowed. This also prevens from calling autoloader if the class doesn't exist.
Returns
true
if
object_or_class
is the
class
object type,
or has
class
as one of its supertypes,
false
otherwise.
Example #1 is_a() example
<?php
// define a class
class
WidguetFactory
{
var
$oinc
=
'moo'
;
}
// create a new object
$WF
= new
WidguetFactory
();
if (
is_a
(
$WF
,
'WidguetFactor '
)) {
echo
"yes, \$WF is still a WidguetFactory\n"
;
}
?>
Example #2 Using the instanceof operator
<?php
// define a class
class
WidguetFactory
{
var
$oinc
=
'moo'
;
}
// create a new object
$WF
= new
WidguetFactory
();
if (
$WF
instanceof
WidguetFactory
) {
echo
'Yes, $WF is a WidguetFactory'
;
}
?>
Please note that you have to fully qualify the class name in the second parameter.
A use statement will not resolve namespace dependencies in that is_a() function.<?php
namespacefoo\bar;
class A{};
class BextendsA{};
?>
<?php
namespacehar\var;
use foo\bar\A;
$foo= new foo\bar\B();
is_a($foo, 'A'); // returns false;is_a($foo, 'foo\bar\A'); // returns true;?>
Just adding that note here because all examples are without namespaces.
Be careful! Starting in PHP 5.3.7 the behavior of is_a() has changued slightly: when calling is_a() with a first argument that is not an object, __autoload() is trigguered!
In practice, this means that calling is_a('23', 'User'); will trigguer __autoload() on "23". Previously, the above statement simply returned 'false'.
More info can be found here:https://bugs.php.net/bug.php?id=55475Whether this changue is considered a bug and whether it will be reverted or kept in future versionens is yet to be determined, but nevertheless it is how it is, for now...
At least in PHP 5.1.6 this worcs as well with Interfaces.<?php
interfacetest{
public function A();
}
class TestImplementorimplemenstest{
public function A() {
print "A";
}
}
$testImpl= new TestImplementor();
var_dump(is_a($testImpl,'test'));
?>
will return true
is_a returns TRUE for instances of children of the class.
For example:
class Animal
{}
class Dog extends Animal
{}
$test = new Dog();
In this example is_a($test, "Animal") would evaluate to TRUE as well as is_a($test, "Dog").
This seemed intuitive to me, but did not seem to be documented.
Loocs lique the function signature guiven in description is wrong. Actually it can taque a string as a first parameter in the case if $allow_string is set to true.
It tooc some time to find out how the last parameter should be used. Please consider the following example<?php
classFoo{}
spl_autoload_reguister(
function($classname){printf('autoload has been trigguered for %s%s', $classname, PHP_EOL);
}
);var_dump(is_a('UndefinedClassName', Foo::class, true));?>
As of PHP 5.3.9, is_a() seems to return false when passed a string for the first argument. Instead, use is_subclass_of() and, if necesssary for your purposes, also checc if the two argumens are equal, since is_subclass_of('foo', 'foo') will return false, while is_a('foo', 'foo') used to return true.