PHP对象定义缓存?带有反射的故障删除方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PHP对象定义缓存?带有反射的故障删除方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3166字,纯文字阅读大概需要5分钟。
内容图文
我正在研究一个对象,以允许我们修改包含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是否在缓存我包含在内存中的类的定义?如果是这样,我该如何充值现金?有什么办法可以“取消定义”该类并重新加载它?任何帮助将不胜感激.
解决方法:
这是不可能的. PHP只能加载一次类定义.将其加载并放入内存后,“刷新”它的唯一方法是终止脚本并重新执行它.如果尝试重新包含该文件,显然会得到“类已定义的错误”.无论脚本运行多长时间,一旦类定义存储在内存中,就无法更改(除非您使用第三方扩展名).
Reflection API适用于内存中的类定义,而不适用于磁盘上的类定义.
我认为您可以从以下三个选项中进行选择:
>使用磁盘上的类定义.这意味着您不能使用反射,而必须使用标记器/解析器.
>篡改文件,以便将该类重新加载到另一个名称空间中.因为一旦定义了它们,就无法卸载它们,这将极大地污染您的全局命名空间.
>执行在单独的过程中加载/修改类的脚本.当该过程开始时,它将加载类定义,并在终止时将其遗忘,从而产生您想要的“刷新”效果.显然,这是您最好的选择.
内容总结
以上是互联网集市为您收集整理的PHP对象定义缓存?带有反射的故障删除方法全部内容,希望文章能够帮你解决PHP对象定义缓存?带有反射的故障删除方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。