有没有一种方法可以使用PHP“取消包含”文件?

8
我正在开发一个PHP IRC机器人,目前正在处理命令。
在启动机器人的脚本 main.php 中,会引入 class_lib.php 文件并实例化该类的对象。我想开发一个 !reload 命令,它可以"取消引用"文件,然后重新引用它。这是否可能?如果只是在发送该命令时再次include它是否足够? 编辑:基本上,我希望能够在不必重启机器人的情况下修改和重新加载类。

你应该解释你试图实现什么,或者更具体地说为什么。你可以简单地重新实例化对象,以卸载和重新加载类定义。 - mario
为什么“new MyClass()”实例不起作用? - lepe
从未想过那个。我会尝试一下,Lepe。 - Rob
5个回答

5
不行,你不能这样做。重新审视你的设计。不要将类的定义与对象的实例化耦合在一起。

实例化是在main.php中完成的,而定义在class_lib.php中。 - Rob

3

为什么不允许对象重新加载默认设置或重启,而要按照您所描述的方式进行操作?我相信您无法这样做。

此外,请勿尝试使用class_lib.php加载对象。请将类文件与对象一起包含,然后在需要时创建对象。这样您就可以停止它,销毁对象,然后重新实例化另一个对象,从而实现您想要的效果。


我不确定如何销毁该对象。 - Rob
如果您正在销毁一个创建了数据库连接或其他存在打开资源的活动对象,则应该在对象类中创建$objectvar-> destroy()函数,以关闭所有资源,保存需要保存的任何内容,然后再unset($objectvar)。 - Jared Farrish
你能详细说明一下吗?你上次的评论涉及到了因取消它而引起的问题。 - Rob
通常,当您拥有一个对象时,您有两个标准方法:__construct(),__destruct()。在此处阅读有关它们的信息:http://php.net/manual/en/language.oop5.decon.php 主要,在构造函数中,您想要做的是启动连接,加载设置(内部/外部),创建类使用的任何依赖对象。然后,当对象被销毁时,析构函数被调用,并确保清理诸如将更改写入文件/数据库,关闭数据库连接,清除会话等内容... 阅读有关OOP的信息:http://php.net/manual/en/language.oop5.php - Jared Farrish
以下是“取消包含”功能的示例:假设您有一个类文件,需要更改文件名[例如,以符合新的编码标准],但是有遗留代码会破坏重命名,因此旧名称的文件不会被删除,而是将类定义移动到新文件中。在旧文件中,除了“require_once 'new_class_file_name.php';”之外,还包括一个错误日志记录类,以便在使用旧文件时记录警告。如果可以取消包含此错误日志记录类文件,则会更加清晰。 - ReverseEMF
@ReverseEMF - 适当的方法是重构并修改对旧包含文件的引用(除非我在某种程度上误解了您的建议,直接指向实际文件是首选)。 PhpStorm和其他代码编辑器提供了简单的方法来完成这个过程。我也不明白为什么“自动取消包含”会有任何用处。手动取消包含,然后继续工作即可。 - Jared Farrish

1

很抱歉,没有办法取消包含一个文件。如果它是一个函数,您可以每次动态生成一个新的函数。

检查:

http://php.net/manual/en/function.create-function.php

你可以将一个函数赋值给一个变量,然后清除该变量并再次进行赋值。


1

虽然有点晚了,但我还是要提到以下PHP扩展:

http://www.php.net/manual/en/book.runkit.php

扩展提供了修改常量、用户自定义函数和用户自定义类的方法。它还通过沙盒提供了自定义超全局变量和可嵌入子解释器。

这将允许您重新定义类,这会在解析包含文件时发生。

注意:我没有使用过这个功能,我是在研究是否有可能以某种方式热交换某些类时发现它的。我不能保证其安全性,并且无法提供实际操作信息。暂时如此。


0

回答晚了一些...

你可以创建一个包含文件的数组,然后使用eval(file_get_contents($filename))

我一直在开发自己的IRC客户端PITC,这可能是我要使用的方法,这也是我以前做事情的方式


1
include $filename 做的事情完全相同。 - AbiusX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接