Подтвердить что ты не робот

Узнайте, существует ли метод в статическом классе

Я хочу проверить, существует ли функция в библиотеке, которую я создаю, которая является статической. Я видел функции и методы_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, если функция существует, без необходимости извлекать ее из статического контекста. Учитывая, что ключевое слово для доступа к классу должно быть "self", а $this предназначено для назначенных классов.

4b9b3361

Ответ 1

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()"

Ответ 2

Update:

Ах, извини. Я был временно слеп:) Вы хотите использовать магическую константу __CLASS __

например.

if (method_exists(__CLASS__, "test3")) { echo "Hi"; }