Как организовать инстанс класса вызванного через call_user_func ? Возник такой вопрос. Пишу систему рангов для пользователя, описание каждого ранга будет находится в отдельном классе. $rangs - массив всех ранговforeach($rangs as $rang) {
$alias = ucwords($rang['alias']);
// проверяем наличие класса для определения ранга if(!class_exists($pathToRangsClass.$alias)) { throw new \Exception('Не найден класс '.$pathToRangsClass.$alias); }
} Вызывается метод класса, все хорошо. Теперь в самом классе мне нужно организовать, что то вроде: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);
Проблема в том, что статический метод 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 для работы с переданным пользовательским идентификатором.
Проблема в том, что статический метод 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 для работы с переданным пользовательским идентификатором.