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


Я хочу проверить, существует ли функция в библиотеке, которую я создаю, которая является статической. Я видел function и method_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", так как $это для назначенных классов.

Author: Tyler Carter, 2009-07-21

3 answers

get_called_class() был представлен в PHP 5.3 и вернет имя класса "Поздняя статическая привязка":

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()"
 51
Author: gapple, 2017-06-19 17:36:08

Обновление:

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

Например,

if (method_exists(__CLASS__, "test3")) { echo "Hi"; }
 1
Author: hobodave, 2009-07-21 00:40:27

Для всех ситуаций… лучшим использованием было бы...

if method_exist(…) && is_callable(…)

Для примера тестирования:

class Foo {
  public function PublicMethod() {}
  private function PrivateMethod() {}
  public static function PublicStaticMethod() {}
  private static function PrivateStaticMethod() {}
}

$foo = new Foo();

$callbacks = array(
  array($foo, 'PublicMethod'),
  array($foo, 'PrivateMethod'),
  array($foo, 'PublicStaticMethod'),
  array($foo, 'PrivateStaticMethod'),
  array('Foo', 'PublicMethod'),
  array('Foo', 'PrivateMethod'),
  array('Foo', 'PublicStaticMethod'),
  array('Foo', 'PrivateStaticMethod'),
);

foreach ($callbacks as $callback) {
  var_dump($callback);
  var_dump(method_exists($callback[0], $callback[1])); // 0: object / class name, 1: method name
  var_dump(is_callable($callback));
  echo str_repeat('-', 40), "n";
}

Источник здесь

 0
Author: sxn, 2018-09-19 05:25:46