Взлом 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".