Pull to refresh

Функции для работы с объектами работают и с классами (PHP 5.2)

Reading time 2 min
Views 2.4K
Оказывается, что спецификация некоторых функций для работы с классами не достаточно точна

ru2.php.net/manual/ru/function.is-subclass-of.php
is_subclass_of — Returns TRUE if the object has this class as one of its parents
bool is_subclass_of ( object object, string class_name);
Эта функция отлично работает и с именем класса.

например, так можно посмотреть все дочерние классы:
function getClassChildren($parentClassName) {
	$result = array();
	foreach (get_declared_classes() as $className) {
		if (is_subclass_of(strtolower($className), $parentClassName) or $className == $parentClassName)
			$result[] = $className;
	}
	return $result;
}

Хотя я так не советую делать, но я слышал, что некоторым хотелось видеть пример этого хака, надеюсь вы найдете способ обойтись без него ;-)

get_parent_class — Возвращает имя класса базового для объекта или класса
string get_parent_class ( mixed $obj )

Тут честно сказано, что аргумент смешанного типа, но многие (сужу по своим приятелям) не обращают на это внимание. Эта функция так же работает чудесно с именем класса.

удивила работа функции method_exists();
<?
class A{
	private $a1="test";
	public $a2="tt";
	static public function aa(){}
}
class B extends A {
	static public function bb(){}
}
$a=new A;
var_dump( method_exists("A",'aa'));
$b=new B;
var_dump( method_exists("B",'aa'));
?>


ответ:
bool(true)
bool(true)

то есть она действительно смотрит есть ли метод для создаваемых объектов, а не для класса.
конечно, функция противоречит идеологии интерфейсов, но иногда ей очень удобно пользоваться.

call_user_method не потерпит извращений:
<?
class A{
	static public function aa(){
		echo 'aaa';
	}
}
call_user_method ('aa', 'A');
?>
Ответом вам будет Fatal error: Only variables can be passed by reference
прошу воспринимать топик как напоминание, может дискуссию
Tags:
Hubs:
+3
Comments 15
Comments Comments 15

Articles