nepster-web
@nepster-web

Как организовать инстанс класса вызванного через call_user_func ?

Возник такой вопрос.
Пишу систему рангов для пользователя, описание каждого ранга будет находится в отдельном классе.

$rangs - массив всех рангов

foreach($rangs as $rang) {
            
            $alias = ucwords($rang['alias']);
        
            // проверяем наличие класса для определения ранга 
            if(!class_exists($pathToRangsClass.$alias)) {
                throw new \Exception('Не найден класс '.$pathToRangsClass.$alias);
            }
            
            $verify = call_user_func("\\modules\\rangs\\libraries\\{$alias}::verify", $userId);
            
       }


Вызывается метод класса, все хорошо. Теперь в самом классе мне нужно организовать, что то вроде:
public static function getInstance($className=__CLASS__)
    {
        return new $className;
    }


что бы был доступ к $this. Но вот никак не получается это организовать.

Вот такие вот приколы не выходят:
$verify = call_user_func("\\modules\\rangs\\libraries\\{$alias}::getInstance", $userId);
$verify = call_user_func("\\modules\\rangs\\libraries\\{$alias}::getInstance()->verify", $userId);
  • Вопрос задан
  • 2583 просмотра
Пригласить эксперта
Ответы на вопрос 4
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Не используйте call_user_func никогда. Он очень медленно работает.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Почему вам так нравятся статические методы? Зачем вам тогда классы? Почему бы просто функции по неймспейскм не пораскидать?
Ответ написан
nazarpc
@nazarpc
Open Source enthusiast
Попробуйте так:
$verify = call_user_func(
    [
        "\\modules\\rangs\\libraries\\{$alias}",
        "getInstance"
    ],
    $userId
);

В массив первым элементом передаете имя класса или инстанс объекта, вторым - название метода.
Почитайте подробнее в официальном источнике: php.net/manual/en/language.types.callable.php

Но исходя из того, что я понял из вашей формулировки нужно что-то типа:
$verify = call_user_func([
    "\\modules\\rangs\\libraries\\{$alias}",
    "getInstance"
])->verify($userId);
Ответ написан
AxisPod
@AxisPod
ООП не ваш путь?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
27 апр. 2024, в 19:58
2500 руб./в час
27 апр. 2024, в 19:48
10000 руб./за проект