[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: eval() не хочет создавать экземпляр класса
AlmazDelDiablo
Итак, приветствую всех. Чуть меньше года я вообще не прикасался к программированию (время так быстро пролетело... казалось, что месяцок отдохнул), многое напрочь забыл и теперь восстанавливаю старые знания. Благо, всё не совсем плохо.

Ближе к делу. Имеется код в классе 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
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.