Узнайте, существует ли метод в статическом классе - PullRequest
35 голосов
/ 21 июля 2009

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

Ответы [ 3 ]

55 голосов
/ 21 июля 2009

static::class доступно с версии PHP 5.5 и возвращает имя класса " Late Static Binding ":

class myClass {
    public static function test()
    {
        echo static::class.'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // should print "subClass::test()"

get_called_class() делает то же самое, и было введено в PHP 5.3

class myClass {
    public static function 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()
    {
        echo get_class().'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"

Магическая константа __CLASS__ делает то же самое [ link ].

class myClass {
    public static function test()
    {
        echo __CLASS__.'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"
2 голосов
/ 21 июля 2009

Обновление:

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

например.

if (method_exists(__CLASS__, "test3")) { echo "Hi"; }
0 голосов
/ 19 сентября 2018

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

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";
}

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

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