Как я могу вызвать статический метод из класса, если у меня есть только строка с именем класса? - PullRequest
37 голосов
/ 15 июня 2009

Как бы заставить что-то подобное работать?

$class_name = 'ClassPeer';
$class_name::doSomething();

Ответы [ 5 ]

59 голосов
/ 15 июня 2009

В зависимости от версии PHP:

call_user_func(array($class_name, 'doSomething'));
call_user_func($class_name .'::doSomething'); // >5.2.3
15 голосов
/ 27 декабря 2014

Чтобы раскрыть возможности автозаполнения IDE и обнаружения ошибок, используйте это:

$class_name = 'ClassPeer';

$r = new \ReflectionClass($class_name );

// @param ClassPeer $instance

$instance =  $r->newInstanceWithoutConstructor();

//$class_name->doSomething();
$instance->doSomething();

По сути, здесь мы вызываем статический метод для экземпляра класса.

10 голосов
/ 15 июня 2009

Использование call_user_func. Также читайте в PHP callbacks.

call_user_func(array($class_name, 'doSomething'), $arguments);
4 голосов
/ 15 июня 2009

Reflection (PHP 5 поддерживает это) - вот как вы это сделаете. Прочитайте эту страницу, и вы сможете понять, как вызывать такую ​​функцию.

$func = new ReflectionFunction('somefunction');
$func->invoke();

Ссылка на документацию

0 голосов
/ 07 февраля 2018

После того, как я почти пропустил простейшее решение от VolkerK, я решил расширить и поместить его в пост. Это как вызвать статические члены в классе экземпляра

// calling class static method
$className = get_class($this);
$result = $className::caluclate($arg1, $arg2);

// using class static member
foreach ($className::$fields as $field) {
  :
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...