Ближе к делу. Имеется код в классе Engine, который забирает экземпляр класса Errors в свой внутренний массив. Однако, $this->libs['Errors'] оказывается пустой.
$libName = 'Errors';
eval( $this->libs[$libName] = $libName .'::getInstance();' );
$this->libs['Errors']->get404();
Вопрос: что не так с eval? Ибо если написать без него, то всё работает.
$this->libs['Errors'] = Errors::getInstance();
Класс Errors:
class Errors
{
static private $instance = null;
/* Реализация синглтона */
static public function getInstance()
{
if( empty( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/* Блокируем клонирование класса */
private function __clone()
{
}
/* Ошибка 404 */
public function get404()
{
die( '404 Not Found' );
}
}
Спустя 6 минут, 29 секунд (31.05.2012 - 15:13) Игорь_Vasinsky написал(а):
Вообще бы оригинал вывода увидеть - там должен быть правильный phpкод
$this->libs[$libName] = $libName .eval('?> ::getInstance();<?php' );
Спустя 7 минут, 51 секунда (31.05.2012 - 15:21) AlmazDelDiablo написал(а):
Игорь_Vasinsky, не совсем понял, оригинал чего хотелось бы увидеть.
С твоим кодом выдает ошибку:
С твоим кодом выдает ошибку:
Parse error: syntax error, unexpected $end in /Engine.class.php(77) : eval()'d code on line 1
Спустя 4 минуты, 47 секунд (31.05.2012 - 15:26) sergeiss написал(а):
Всё потому, что ты не читал (или не понял) описание функции eval()
Из хэлпа:
Из хэлпа:
Цитата (help) |
Description mixed eval ( string $code_str ) Evaluates the string given in code_str as PHP code. Among other things, this can be useful for storing code in a database text field for later execution. |
И что ты передаешь, какой-то жуткий микс, который не понятен для ПХП:
Цитата (AlmazDelDiablo @ 31.05.2012 - 16:07) |
eval( $this->libs[$libName] = $libName .'::getInstance();' ); |
Спустя 21 секунда (31.05.2012 - 15:26) Игорь_Vasinsky написал(а):
Ты вкурсе зачем eval() пользуешь? я и хотел оригинал кода увидеть, который в eval обрабатываешь.
$this->libs[$libName] = $libName .eval('?>::getInstance();');
Спустя 5 минут, 44 секунды (31.05.2012 - 15:32) AlmazDelDiablo написал(а):
Цитата (sergeiss @ 31.05.2012 - 17:26) |
Всё потому, что ты не читал (или не понял) описание функции eval() |
Да, действительно. Перечитал описание, исправил код и всё заработало. Спасибо за наводку.
eval( '$this->libs[\''.$libName.'\'] = '. $libName .'::getInstance();' );
Спустя 3 часа, 1 минута, 45 секунд (31.05.2012 - 18:34) Dezigo написал(а):
Без eval();
или
или
$libName = 'Errors';
$libs[$libName] = call_user_func($libName.'::getInstance');
или
$libName = 'Errors';
$libs[$libName] = call_user_func(array($libName, 'getInstance'));
или
$libName = 'Errors';
$libs[$libName] = $libName::getInstance();
_____________
Блог | VK | GitHub | Twitch