CakeFest 2024: The Official CakePHP Conference

is_subclass_of

(PHP 4, PHP 5, PHP 7, PHP 8)

is_subclass_ofBelirtilen sınıfın belirtilen nesnenin ebeveynlerinden biri mi yoksa onu gerçekleyen mi diye bakar

Açıklama

is_subclass_of(mixed $nesne_veya_sınıf, string $sınıf, bool $dizge_olmaz = true): bool

Belirtilen sınıf sınıfının, belirtilen nesne_veya_sınıfın ebeveynlerinden biri mi yoksa onu gerçekleyen mi diye bakar.

Bağımsız Değişkenler

nesne_veya_sınıf

Nesne veya sınıf ismi. Sınıf mevcut değilse bir hata oluşmaz.

sınıf

Olası ebeveynin ismi.

dizge_olmaz

false belirtilirse nesne_veya_sınıf bağımsız değişkeninde string türünde sınıf ismi belirtilebilir. Bu durumda, sınıf mevcut değilse otomatik yükleyici çağrılmaz.

Dönen Değerler

nesne_veya_sınıf, sınıfın alt sınıflarından birine aitse true değilse false döner.

Örnekler

Örnek 1 - is_subclass_of() örneği

<?php
// bir sınıf tanımlayalım
class EdevatFabrikası
{
var
$oink = 'moo';
}

// Bir alt sınıf tanımlayalım
class MakineAtölyesi extends EdevatFabrikası
{
var
$oink = 'oink';
}

// Yeni bir nesne oluşturalım
$EF = new EdevatFabrikası();
$MA = new MakineAtölyesi();

if (
is_subclass_of($MA, 'EdevatFabrikası')) {
echo
"Evet, \$MA EdevatFabrikası'nın bir alt sınıfıdır\n";
} else {
echo
"Hayır, \$MA EdevatFabrikası'nın bir alt sınıfı değildir\n";
}


if (
is_subclass_of($EF, 'MakineAtölyesi')) {
echo
"Evet, \$EF MakineAtölyesi'nin bir alt sınıfıdır\n";
} else {
echo
"Hayır, \$EF MakineAtölyesi'nin bir alt sınıfı değildir\n";
}

if (
is_subclass_of('MakineAtölyesi', 'EdevatFabrikası')) {
echo
"Evet, MakineAtölyesi EdevatFabrikası'nın bir alt sınıfıdır\n";
} else {
echo
"Hayır, MakineAtölyesi EdevatFabrikası'nın bir alt sınıfı değildir\n";
}
?>

Yukarıdaki örneğin çıktısı:

Evet, $MA EdevatFabrikası'nın bir alt sınıfıdır
Hayır, $EF MakineAtölyesi'nin bir alt sınıfı değildir
Evet, MakineAtölyesi EdevatFabrikası'nın bir alt sınıfıdır

Örnek 2 - Arayüz kullanılan is_subclass_of() örneği

<?php
// Arayüzü tanımla
interface MyInterface
{
public function
MyFunction();
}

// arayüzün sınıf gerçeklenimini tanımla
class MyClass implements MyInterface
{
public function
MyFunction()
{
return
"MyClass Implements MyInterface!";
}
}

// Nesneyi örnekle
$my_object = new MyClass;

// Sınıfın nesne örneğini kullanarak deneme yap
if (is_subclass_of($my_object, 'MyInterface')) {
echo
"Evet, \$my_object MyInterface'in alt sınıfıdır\n";
} else {
echo
"Hayır, \$my_object MyInterface'in alt sınıfı değildir\n";
}

// Sınıf ismini dizgesi kullanarak deneme yap
if (is_subclass_of('MyClass', 'MyInterface')) {
echo
"Evet, MyClass MyInterface'in alt sınıfıdır\n";
} else {
echo
"Hayır, MyClass MyInterface'in alt sınıfı değildir\n";
}
?>

Yukarıdaki örneğin çıktısı:

Evet, $my_object MyInterface'in alt sınıfıdır
Evet, MyClass MyInterface'in alt sınıfıdır

Notlar

Bilginize:

Sınıf zaten biliniyorsa, otomatik yüklenen sınıflar için bu işlev kullanılabilir.

Ayrıca Bakınız

  • get_class() - Bir nesnenin ait olduğu sınıfın ismini döndürür
  • get_parent_class() - Nesne veya sınıfın ebeveyn sınıfının ismini döndürür
  • is_a() - Nesne sınıfın mı yoksa üst sınıflarından birinin örneği mi diye bakar
  • class_parents() - Return the parent classes of the given class

add a note

User Contributed Notes 9 notes

up
17
gunniboyh at web dot de
17 years ago
is_subclass_of() works also with classes between the class of obj and the superclass.

example:
<?php
class A {};
class
B extends A {};
class
C extends B {};

$foo=new C();
echo ((
is_subclass_of($foo,'A')) ? 'true' : 'false');
?>

echoes 'true' .
up
10
nicholas at aquarionics dot com
15 years ago
This might be useful to someone, so:

If you're using Autoload, you should be aware that this will attempt to autoload $classname if it isn't already loaded. I discovered this when I had something using is_subclass_of inside an error thrown by autoload, which then recursed until it ran out of memory.
up
2
alan at jynxy.net
5 years ago
The $allow_string parameter is not very clearly documented. When true, it simply allows the first parameter to be the name of a class, instead of an object whose class we are interested in.

Some usage examples:

class parent_class {
// objects and methods ...
}

$possible_child_object = new possible_child_class(); // might be an extension of parent_class

$result = is_subclass_of($possible_child_object, 'parent_class'); // valid
$result = is_subclass_of($possible_child_object, 'parent_class', false); // valid
$result = is_subclass_of('possible_child_class', 'parent_class', true); // valid
$result = is_subclass_of('possible_child_class', 'parent_class', false); // not valid
up
1
Anonymous
1 year ago
You can check if your current class is a child with:

<?php is_subclass_of($this, self::class) ?>

<?php
class a {
public function
check(): bool {
return
is_subclass_of($this, self::class);
}
}

class
b extends a {}

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

echo
$a->check() ? 'Yes' : 'No';
echo
PHP_EOL;
echo
$b->check() ? 'Yes' : 'No';
echo
PHP_EOL;
?>

prints:
No
Yes
up
0
Shane
4 days ago
In addition to Anonymous's post above regarding using this to determine whether your class has been inherited or not, you may also use this in static methods as follows:

<?php
class a {
public static function
check() {
return
is_subclass_of(static::class, self::class);
}
}

class
b extends a {}

echo
a::check() ? "Yes" : "No";
echo
PHP_EOL;
echo
b::check() ? "Yes" : "No";
echo
PHP_EOL;
?>

Prints:
No
Yes
up
-3
kostyl_kostyl gav-gav mail point ru
15 years ago
<?php
interface I {
}
class
A implements I {
}
class
B extends A {
}
if (
is_subclass_of('A', 'I')) {
echo
'good<br>';
}
else {
echo
'bad<br>';
}
if (
is_subclass_of('B', 'I')) {
echo
'good<br>';
}
else {
echo
'bad<br>';
}
if (
is_subclass_of('B', 'A')) {
echo
'good<br>';
}
else {
echo
'bad<br>';
}
?>

result:
bad <- you must to describe intermediate class B to be good
good
good
up
-2
Damien Bezborodov
15 years ago
If you need something similar to is_subclass_of() to determine if a class implements an interface before instantiating it, use reflection:

<?php

interface A_Interface {}
class
A implements A_Interface {}

$reflectionA = new ReflectionClass('A');
var_dump(
$reflectionA->implementsInterface('A_Interface')
);

?>
bool(true)
up
-3
jm
15 years ago
It would appear that is_subclass_of is case insensitive unlike get_class in php5.
i.e.

<?php
class fooBar {}
class
bar extends fooBar {}

assert(get_class(new fooBar()) == "fooBar");
assert(is_subclass_of(new bar(), "foobar") == true);
?>

i run across this while migrating some code from php4 to php5 and the code would only half-the-time break.
up
-7
Ondra Zizka
17 years ago
For PHP4:

<?php
/** Returns whether specified class is subclass of the other class. */
function is_subclass($sClass, $sExpectedParentClass){
do if(
$sExpectedParentClass === $sClass ) return true;
while(
false != ($sClass = get_parent_class($sClass)) );
return
false;
}
// Test:
class A {} class B extends A {} class C extends B {} echo (int) is_subclass('C', 'A');
?>
To Top