Взлом get_called_class не работает с eval-кодом - PullRequest
0 голосов
/ 14 июня 2010

Я использую хак ge_called_class для разрешения позднего статического связывания в php версии 5.2 (найдено здесь ).

В моем коде есть следующее:

# 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 не может прочитать уклоненный фрагмент кода.

1 Ответ

0 голосов
/ 14 июня 2010

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

Почему ваша не-версия не работает? Что не так? Что такое полное и полное сообщение об ошибке?

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

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

Вы пытались использовать call_user_func ? call_user_func(array($ac, 'find'), 'all') должен вызвать статический метод find для имени класса, содержащегося в $ac с параметром 'all'. См. Также псевдотип обратного вызова и конкретный пример «Тип 2»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...