Я работаю над объектом, чтобы позволить нам изменять файлы PHP, содержащие объекты PHP.(В частности, это файлы сущностей Doctrine, которые мы должны изменить.)
В любом случае, без скучных деталей здесь происходит то, что происходит.Сначала я нахожу местоположение файла класса и включаю его.Затем я создаю экземпляр класса и отражатель класса, используя приведенный ниже код.Как вы можете видеть, когда я создаю экземпляр объекта и отражателя, я также вызываю метод для загрузки текста класса с диска в строку и другой метод для разбиения этой строки в массив по строкам.
public function loadClass()
if(!class_exists($this->class_name)) {
$this->error = "Class name: '$this->class_name' was not found.";}
else {
//Class is found. Load it and populate properties
$this->oClass = new $this->class_name;
$this->oRClass = new \ReflectionClass($this->oClass);
$this->source_file = $this->oRClass->getFileName();
$this->error = "";
$this->class_namespace = $this->oRClass->getNamespaceName();
$this->getClassText(); //Load class code from source file
$this->getClassArray(); //Load class text into array
}
}
Затем я использую функцию с именем "deleteMethod()
", чтобы удалить код PHP для определенного метода следующим образом: $this->deleteMethod("badMethod");
.Затем эта функция находит начальную строку, а затем конечную строку рассматриваемого метода, удаляет строку, сохраняет код класса PHP обратно на диск и снова запускает «loadClass()
», чтобы повторно проанализировать обновленный объект, чтобы он был готов кбольше редактирования.Ниже приведен отрывок функции "deleteMethod()
".
$oMethod = $this->oRClass->getMethod($meth_name); //Get a refection method object
$oMethod->setAccessible(true); //In case method is private
$start_line = $oMethod->getStartLine() -1; //Line method starts at
$length = $oMethod->getEndLine() - $start_line + 1 //Number of lines in method
array_splice($this->class_array, $start_line, $length); //Hack lines out of array
$this->class_text = implode("\n", $this->class_array); //Convert array back to a string
$this->saveClassText(); //Save updated code back to disk.
$this->loadClass(); //Reload and reparse for consistancy
Проблема в том, что объект появляется где-то в кэше.Когда я снова запускаю функцию $this->deleteMethod("anotherBadMethod");
, она больше не возвращает правильные строки начала / конца для следующего метода, который будет удален.После некоторой проверки стало очевидно, что когда я пытаюсь получить начальную / конечную строку для следующего метода, который нужно удалить, PHP все еще использует определение класса OLD.Кажется, он НЕ видит, что какой-то код был удален из файла, а номера строк изменились.Как видите, я создаю экземпляр как объекта, так и объекта отражения каждый раз, когда мы запускаем loadClass()
.И да, я пытался установить их в NULL, прежде чем их создавать.
Я также убедился, что PHP правильно видит файл определения класса.Это означает, что, даже если файл был включен, отражение getFileName();
действительно видит, что класс определен там, где и должен быть.
Soooo .... Кэширует ли PHP определение класса, который я включил вобъем памяти?Если так, как я могу сбросить эти деньги?Есть ли какой-нибудь способ «отменить» этот класс и перезагрузить его?Любая помощь будет принята с благодарностью.