如何在主PHP脚本中运行两个存在类名冲突的子脚本?
PHP不支持卸载已经定义的类、函数、常量等符号,所以你想要清除之前加载的内容来解决类名冲突的思路走不通,你可以用下面两种方案解决问题:
方案1:独立进程执行子脚本(无需修改原有子脚本)
你可以让两个子脚本分别在独立的PHP进程中运行,互相之间不会共享已定义的符号,也就不会出现类名冲突的问题,你可以用shell_exec、exec、proc_open等函数实现,主脚本示例如下:
<?php // master_script.php // 注意根据你实际的PHP执行路径和脚本路径调整写法 shell_exec('php ' . __DIR__ . '/script_one.php'); shell_exec('php ' . __DIR__ . '/script_two.php'); ?>
这种方案的优势是完全不需要修改原有两个子脚本的代码,如果你需要主脚本和子脚本之间传递参数,可以通过命令行参数、临时文件、缓存中间件等方式实现,子脚本的执行输出也可以直接作为执行函数的返回值拿到。
方案2:使用命名空间隔离(适合可以修改子脚本的场景)
如果你使用的是PHP5.3及以上版本,可以通过给两个子脚本的类添加不同命名空间的方式避免冲突,修改后的子脚本示例:
修改后的script_one.php
<?php // script_one.php namespace ScriptOne; class foo{ public function do_something(){ } } $foo = new foo(); $foo->do_something(); ?>
修改后的script_two.php
<?php // script_two.php namespace ScriptTwo; class foo{ public function do_something_two(){ } } $foo = new foo(); $foo->do_something_two(); ?>
修改之后你原来的主脚本直接require两个文件也不会报错,两个foo类因为归属不同的命名空间,会被PHP识别为两个不同的类。这种方案的优势是所有脚本都在同一个进程中运行,数据传递更方便,性能也更高。
内容的提问来源于stack exchange,提问作者Nathanael Skrepek
相关产品推荐
相关产品推荐

