在php中重新声明变量,或在运行时有效地重新加载类

在php中重新声明变量,或在运行时有效地重新加载类,php,object,Php,Object,我需要能够有效地重新声明我的类,这样在运行时,当我的PHP IRC bot运行时,我可以随着代码基的变化重新加载模块,这需要获取类,但PHP不允许重新声明,也没有办法取消声明类 有没有办法让我做到这一点?也许还有别的方法?我试过runkit,但失败了 我目前的代码如下: 因此,为了澄清,我需要能够重新加载我的类,在所述模块中的代码发生更改后,将其稳定并放入主bot类中的属性中,同时bot正在运行。简单地看一下您的应用程序,我相信您最好的做法是使用上面评论中建议的基类 在某种程度上: class

我需要能够有效地重新声明我的类,这样在运行时,当我的PHP IRC bot运行时,我可以随着代码基的变化重新加载模块,这需要获取类,但PHP不允许重新声明,也没有办法取消声明类

有没有办法让我做到这一点?也许还有别的方法?我试过runkit,但失败了

我目前的代码如下:


因此,为了澄清,我需要能够重新加载我的类,在所述模块中的代码发生更改后,将其稳定并放入主bot类中的属性中,同时bot正在运行。

简单地看一下您的应用程序,我相信您最好的做法是使用上面评论中建议的基类

在某种程度上:

class IRCModule {

    private static $module_dir = ''; //put your module directory here w/o trailing slash

    public static function getModule( $module ) {

        //if the module directory doesn't exist, don't do anything
        if( !is_dir( self::$module_dir.DIRECTORY_SEPARATOR.$module ) ) return false;

        //load the module file
        $fname = scandir(self::$module_dir.DIRECTORY_SEPARATOR.$module);
        $fname = $fname[2]; //first 2 elements will be . and ..

        require_once( self::$module_dir.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$fname );

        $className = str_replace('.class.php',NULL,$fname);

        return new $className();

    }

}
然后,您可以使用您的模块来扩展它。这将允许您通过简单地删除模块的旧文件/my/module/dir/moduleName/moduleNameEV1.0.class.php并将其替换为新版本/my/module/dir/moduleName/moduleNameEV1.1.class.php来覆盖模块

如注释中所述,这将最终填满服务器上的内存,因此每次进行重大更改时,您都应该计划重新启动服务,但它也允许您在不停止服务的情况下按需加载新版本


一种更稳定的方法是利用进程控制和从父脚本中为每个连接剥离守护进程,或者实现一个缓存系统,将所有数据存储在磁盘/数据库中,以便可以检测模块版本的更改并立即重新启动服务器。但是上面的解决方案目前应该对您有效:

简单看一下您的应用程序,我相信您最好的做法是使用上面评论中建议的基类

在某种程度上:

class IRCModule {

    private static $module_dir = ''; //put your module directory here w/o trailing slash

    public static function getModule( $module ) {

        //if the module directory doesn't exist, don't do anything
        if( !is_dir( self::$module_dir.DIRECTORY_SEPARATOR.$module ) ) return false;

        //load the module file
        $fname = scandir(self::$module_dir.DIRECTORY_SEPARATOR.$module);
        $fname = $fname[2]; //first 2 elements will be . and ..

        require_once( self::$module_dir.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.$fname );

        $className = str_replace('.class.php',NULL,$fname);

        return new $className();

    }

}
然后,您可以使用您的模块来扩展它。这将允许您通过简单地删除模块的旧文件/my/module/dir/moduleName/moduleNameEV1.0.class.php并将其替换为新版本/my/module/dir/moduleName/moduleNameEV1.1.class.php来覆盖模块

如注释中所述,这将最终填满服务器上的内存,因此每次进行重大更改时,您都应该计划重新启动服务,但它也允许您在不停止服务的情况下按需加载新版本


一种更稳定的方法是利用进程控制和从父脚本中为每个连接剥离守护进程,或者实现一个缓存系统,将所有数据存储在磁盘/数据库中,以便可以检测模块版本的更改并立即重新启动服务器。但是上面的解决方案目前应该适合您:

创建一个基类,然后执行类似MyClassV123扩展MyBase的操作怎么样。这样您就可以不断加载新版本。当然,如果你经常这样做的话,这会导致内存泄漏,但是我想说php对于长时间运行来说并不完美。创建一个基类,然后像MyClassV123那样扩展MyBase怎么样。这样您就可以不断加载新版本。当然,如果您经常这样做,这会泄漏内存,但我要说的是,php对于长时间运行并不是完美的。