Взлом get_called_class не работает с eval-кодом

Я использую 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 ответ

Решение

Если вы используете 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".

Другие вопросы по тегам