Zend 2导入和全局命名空间


Zend 2 Imports and Global Namespace

我正在尝试将一个遗留应用程序封装在Zend2 MVC框架中。感谢Zend Skeleton应用程序和代码示例(尤其是https://github.com/maglnet/MaglLegacyApplication),我已经解决了大部分问题。

以下"遗留"文件说明了我未能解决的一个大问题:

<?php
$test = "test";
function echo_test(){
        global $test;
        echo "test = ";
        var_dump($test); # Makes NULL explicit
}
echo_test();

在ZF2模块的控制器中,我使用输出缓冲区捕获include的输出,并将其粘贴到响应对象中:

...
chdir($filePath) # Fixes relative includes
ob_start();
include $filePathAndName;
$output = ob_get_clean();
$response->setContent($output);
return $response;

然后我得到CCD_ 1。

我看到了ZF2名称空间可能会给遗留文件带来问题的警告,并进行了跑腿工作,试图澄清原因。根据PHP指南,"在没有任何命名空间定义的情况下,所有类和函数定义都被放置在全局空间中"。事实上,我的样本只比下面列出的那个稍微复杂一点。。。但它似乎不起作用。

我还看到"你可以在声明一个命名空间后设置一个变量,但变量永远存在于全局范围内。它们永远不会绑定到命名空间。".

我继续研究,最终发现这种方法"将include文件的内容导入方法范围,而不是类范围"。

是否有任何方法可以处理方法范围之外的文件?

这与PHP命名空间无关。如果您在ZF控制器操作中包含一个文件,它将在该函数的变量范围内执行。为了使您的示例正常工作,您还需要在ZF操作中声明global $test;,然后再包含该文件(这将非常糟糕)。

如果不知道遗留代码的确切外观,很难提出一个好的解决方案。如果您需要处理一定数量的全局变量,您可以在ZF应用程序的早期某个时间点对其进行全局处理(目的是在以后删除该破解)。如果你事先不知道全局变量是什么,或者有大量的全局变量,你可能需要编辑遗留代码,尝试重构对全局变量的依赖。

另一个选项(至少在理论上)是使用exec()、shell_exec()、passthru()(自动打印输出)或curl(请参阅shell_eexec链接,但前提是您将其托管在ZF2之外以避免无限循环)。这种方法有自己的缺点,包括:

  • 安全(但请参阅escapeshellarg)
  • 访问$_SERVER(此处问题的第一条注释可能会有所帮助)、$_GET(但请参阅此技巧)、$_POST,尤其是$_COOKIES
  • php命令行中的错误(可能已解决)