Как организовать инстанс класса вызванного через 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);

21 Авг 2019 в 07:09
174 +1
0
Ответы
1

Проблема в том, что статический метод getInstance возвращает экземпляр класса, на который он вызывается, и использование $this в нем не имеет смысла. Если вам нужно обращаться к экземпляру класса в методе verify, вам нужно передавать экземпляр класса в метод verify, а не делать getInstance.

Примерно так:

class SomeRankClass {
protected $userId;
public function __construct($userId) {
$this->userId = $userId;
}
public static function verify($userId) {
$instance = new self($userId);
return $instance->doVerify();
}
public function doVerify() {
// здесь можно использовать $this->userId для проверки
// и выполнения других действий
}
}
// В вашем коде
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);
}

Таким образом, в методе doVerify вы сможете использовать $this->userId для работы с переданным пользовательским идентификатором.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 577 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир