重新装入类
原学程将引见从新装进类的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。
成绩描写
我有1个在敕令言上运转的PHP保护法式剧本,不妨经由过程telnet等衔接到该剧本并接收敕令。
它对于该敕令的处置鉴于减载的模块,这是以后在开端时完成的。(为简练起睹,请拜见上面的伪代码)
$modules = LoadModules();
StartConnection();
while(true){
ListenForCo妹妹ands();
}
function LoadModules(){
$modules = Array();
$dir = scandir("modules");
foreach($dir as $folder){
include("modules/".$folder."/".$folder.".php");
$modules[$folder] = new $folder;
}
}
function ListenForCo妹妹ands(){
if(($co妹妹and = GetData())!==false){
if(isset($modules[$co妹妹and])){
$modules[$co妹妹and]->run();
}
}
}
是以,1个名为"bustime"的示例模块将是1个名为bustime的类,它位于/MODULES/Bustime/bustimes.php
这任务患上很佳。然则,我想让它不妨静态革新模块,如许作为ListenForCo妹妹ands的1部门,它会检查模块的文件时光,肯定它能否变动了,假如变动了,则有用天从新减载类。
这便是成绩地点,很显著,假如我再次包括类文件,它将失足,由于类曾经存留。
到今朝为止,我一切闭于怎样处理这个成绩的设法主意皆是病态的,我想防止如许做。
到今朝为止,我有多少个潜伏的处理计划,但是我对于它们皆没有满足。
革新模块时,将其置于新的定名空间中,并将援用指向该定名空间
我没有爱好这个选项,也没有肯定能否不妨如许做(似乎我是对于的,定名空间必需在文件的顶部界说?这相对不妨应用FILE_GET_CONTENTS()处理,但是我愿望防止)
剖析PHP文件,而后应用runkit-办法-重界说从新界说一切办法。
所有触及这类剖析的工作皆是蹩脚的筹划。
没有包含该文件,而是复制该文件,一切实质皆雷同,但是str_将类名调换为终尾戴有rand()或者相似的实质以使其独一。
关于怎样a)处理此成绩或者b)重组模块体系以免此成绩产生,有谁有更佳的设法主意吗?
我们异常迎接所有修议/设法主意/扶植性的批驳!
推举谜底
您能够应当在分叉过程中按需减载文件。
您会支到1个要求
=>派死主过程,包含模块并运转它。
这借许可您1次运转多个敕令,而不用期待每一个敕令运转后再开动下1个敕令。
php中的Fork:
http://php.net/manual/en/function.pcntl-fork.php
佳了闭于从新装进类的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。