Я хочу проверить, существует ли функция в библиотеке, которую я создаю, которая является статической. Я видел функции и методы_exists, но не нашел способ, который позволяет мне называть их в относительном контексте. Вот лучший пример:
class myClass{ function test1() { if(method_exists("myClass", "test1")) { echo "Hi"; } } function test2() { if(method_exists($this, "test2")) { echo "Hi"; } } function test3() { if(method_exists(self, "test3")) { echo "Hi"; } } } // Echos Hi myClass::test1(); // Trys to use 'self' as a string instead of a constant myClass::test3(); // Echos Hi $obj = new myClass; $obj->test2();
Мне нужно иметь возможность сделать тест 3 echo Hi, если функция существует, без необходимости извлекать ее из статического контекста. Учитывая, что ключевое слово для доступа к классу должно быть «я», в качестве $ это для назначенных классов.
get_called_class()
был введен в PHP 5.3 и вернет имя класса «Late Static Binding»:
class myClass{ public static function test() { if(method_exists(get_called_class(), "test")) { echo get_called_class().'::test()'; } } } class subClass extends myClass{} subClass::test() // should print "subClass::test()"
Функция get_class()
, которая с php 5.0.0 не требует каких-либо параметров, если вызываемый внутри класса возвращает имя класса, в котором была объявлена функция (например, родительский класс):
class myClass{ public static function test() { if(method_exists(get_class(), "test")) { echo get_class().'::test()'; } } } class subClass extends myClass{} subClass::test() // prints "myClass::test()"
Магическая константа __CLASS__
делает то же [ ссылка ].
class myClass{ public static function test() { if(method_exists(__CLASS__, "test")) { echo __CLASS__.'::test()'; } } } class subClass extends myClass{} subClass::test() // prints "myClass::test()"
Ах, извини. Я был временно слеп 🙂 Вы хотите использовать магическую константу __CLASS__
например
if (method_exists(__CLASS__, "test3")) { echo "Hi"; }