Проверка, является ли класс подклассом другого - PullRequest
20 голосов
/ 23 апреля 2009

Я хочу проверить, является ли класс подклассом другого, не создавая экземпляр. У меня есть класс, который получает в качестве параметра имя класса, и, как часть процесса проверки, я хочу проверить, относится ли он к определенному семейству классов (чтобы предотвратить проблемы безопасности и тому подобное). Есть ли хороший способ сделать это?

Ответы [ 5 ]

32 голосов
/ 23 апреля 2009

is_subclass_of() будет правильно проверять, расширяет ли класс другой класс, но не возвращает true, если два параметра совпадают (is_subclass_of('Foo', 'Foo') будет false).

Простая проверка на равенство добавит необходимые вам функции.

function is_class_a($a, $b)
{
    return $a == $b || is_subclass_of($a, $b);
}
13 голосов
/ 23 апреля 2009

Да, с Отражение

<?php

class a{}

class b extends a{}

$r = new ReflectionClass( 'b' );

echo "class b "
    , (( $r->isSubclassOf( new ReflectionClass( 'a' ) ) ) ? "is" : "is not")
    , " a subclass of a";
11 голосов
/ 23 апреля 2009

Выезд is_subclass_of(). Начиная с PHP5, он принимает оба параметра в виде строк.

Вы также можете использовать instanceof. Он вернет true, если класс или соответствует любому из его потомков.

7 голосов
/ 04 августа 2015

Вы можете использовать is_a() с третьим параметром $allow_string, который был добавлен в PHP 5.3.9. Это позволяет строку в качестве первого параметра, который обрабатывается как имя класса:

Пример:

interface I {}
class A {}
class B {}
class C extends A implements I {}

var_dump(
    is_a('C', 'C', true),
    is_a('C', 'I', true),
    is_a('C', 'A', true),
    is_a('C', 'B', true)
);

Выход:

bool(true)
bool(true)
bool(true)
bool(false)

Демо: http://3v4l.org/pGBkf

0 голосов
/ 02 июня 2017

Вам нужно использовать функцию is_subclass_of (), чтобы это выяснить. Пожалуйста, проверьте ниже образец кода.

class Foo{
 function __construct(){
  print("This is class Foo<br/>");
 }
}

class Bar extends Foo{
 function __construct(){
  print("This is class Bar<br/>");
 }
}

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

print("Is Bar Subclass of Foo : ".is_subclass_of($b,'Foo')."<br/>");
print(is_subclass_of($f,'Bar'));

- Выход для того же будет:

This is class Foo
This is class Bar
Is Bar Subclass of Foo : 1

Обратите внимание, что для последней строки не будет напечатан вывод is_subclass_of($f,'Bar'), что приведет к сбою при проверке по условию.

Если вы хотите увидеть их логические значения, вам нужно использовать var_dump() вместо print().

Пожалуйста, проверьте эту ссылку для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...