2010-06-13 6 views
0

Я использую hack для разрешения поздней статической привязки в php версии 5.2 (найдено here).get_called_class hack не работает с eval-кодом

У меня есть следующий в моем коде:

# db_record.php 
$ac = "ForumThread"; 
$objects = $ac::find("all"); 

Это не будет работать в PHP 5.2 для какой-то причины, так что я сделал это:

# db_record.php 
$ac = "ForumThread"; 
eval("\$objects = {$ac}::find('all');"); 

этого с другой стороны, не будет работа с функцией get_called_class. Я получаю сообщение об ошибке, что функция file не может прочитать обведенный раздел кода.

ответ

0

Если вы используете eval, ваше решение неверно.

Почему ваша версия, не относящаяся к eval, не работает? Что происходит не так? Каково полное и полное сообщение об ошибке?

Пользовательская версия get_called_class выполняет обратную трассировку и пытается открыть файл вызывающего абонента для определения имени класса. Причина, по которой eval терпит неудачу, связана с тем, что eval backtrace не предоставляет имя файла.

(Edit: Кроме того, что get_called_class хак очень хак Есть причина, вы не можете использовать 5.3.?)

Вы пробовали использовать call_user_func? call_user_func(array($ac, 'find'), 'all')должен вызвать статический метод find для имени класса, содержащегося в $ac с параметром 'all'. См. Также: callback pseudo-type, and the "Type 2" example in specific

+0

Я полностью согласен с тем, что не нужно использовать 'eval', но так бывает, что он работает на моем собственном поле с php 5.3, но не на сервере с 5.2. Запуск будет вызывать эту ошибку: Синтаксическая ошибка: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM в /home/virtual/atanea.dk/vendor/framework/lib/db_record.php на линии 89 Фатальная ошибка: Вызов функции члена правопреемника() на не-объекте в /home/virtual/atanea.dk/vendor/framework/lib/action_view.php в строке 87' – Ekampp

+0

И о том, почему я не использую 5.3, является то, что моя хостинговая компания не поддерживает он еще с аргументом о том, что он все еще нестабилен. Поэтому я вынужден делать все взломы. – Ekampp

+0

Все еще нестабильно? В течение этого месяца он отсутствовал. Ваш хозяин полон этого. Что касается ошибки, попробовали ли вы использовать call_user_func? 'call_user_func (array ($ ac, 'find'), 'all')' * должен * вызывать статический метод 'find' для имени класса, содержащегося в' $ ac', с параметром '' all''. (Это было включено в мой ответ.) – Charles