Есть ли способ ссылаться на статический метод класса для использования с call_user_func без использования строк?
На данный момент я знаю только два варианта вызова метода register в классе User:
call_user_func([User::class, 'register']);
call_user_func(User::class . '::register');
Оба способа требуют использования строки для идентификации метода, что делает невозможным рефакторинг кода.
В качестве примера, например свойств, я использую этот обходной путь, который отлично работает:
class User {
/**
* @return static
*/
public static function prop()
{
return new PropertyName();
}
}
class PropertyName
{
public function __get($name)
{
return $name;
}
}
Так что я мог бы написать это с поддержкой автозаполнения и рефакторинга:
User::factory()
->where(User::prop()->email, $email)
->get_one()
@ Хавьер. Ваш вопрос похож на Can I achieve dynamism without using dynamism ?. Ответ НЕТ. В PHP динамизм (или изменение выполняемой функции на лету) достигается помещением этого имени функции в некоторую строку / переменную.
Я только что обнаружил, что моя IDE PhpStorm поддерживает рефакторинг при обращении к статическим методам, таким как call_user_func([User::class, 'register']);. Это может сработать для этого сценария.






Чтобы ответить на вопрос «Есть ли способ ссылаться на статический метод класса для использования с call_user_func без использования строк?» - Да
Но я не уверен, что это то, что вы хотите: D
class Foo {
public static function bar() {
echo "yaay \o/";
}
}
call_user_func(function() {
Foo::bar();
});
Спасибо, но моя цель - получить ссылку на статический метод, который действителен для сериализации, а замыкания - нет.
AFAIK нет. Это PHP для вас. Классы и функции не являются объектами первого класса. Даже
::class- это своего рода хакерский аддон, упрощающий немного.