重新装入类

原学程将引见从新装进类的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

重新装入类 教程 第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

佳了闭于从新装进类的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。