Ссылочный статический метод из кода в PHP

Есть ли способ ссылаться на статический метод класса для использования с 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()

AFAIK нет. Это PHP для вас. Классы и функции не являются объектами первого класса. Даже ::class - это своего рода хакерский аддон, упрощающий немного.

deceze 22.06.2018 13:07

@ Хавьер. Ваш вопрос похож на Can I achieve dynamism without using dynamism ?. Ответ НЕТ. В PHP динамизм (или изменение выполняемой функции на лету) достигается помещением этого имени функции в некоторую строку / переменную.

Agnius Vasiliauskas 22.06.2018 13:14

Я только что обнаружил, что моя IDE PhpStorm поддерживает рефакторинг при обращении к статическим методам, таким как call_user_func([User::class, 'register']);. Это может сработать для этого сценария.

Javier Marín 22.06.2018 13:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
26
1

Ответы 1

Чтобы ответить на вопрос «Есть ли способ ссылаться на статический метод класса для использования с call_user_func без использования строк?» - Да

Но я не уверен, что это то, что вы хотите: D

class Foo {

    public static function bar() {
        echo "yaay \o/";
    }

}

call_user_func(function() {
    Foo::bar();
});

Спасибо, но моя цель - получить ссылку на статический метод, который действителен для сериализации, а замыкания - нет.

Javier Marín 22.06.2018 13:18

Другие вопросы по теме