Zend 2 Imports和Global Namespace

时间:2014-10-07 21:58:45

标签: php namespaces zend-framework2 global-variables legacy

我试图在Zend2 MVC框架中包装遗留应用程序。感谢Zend Skeleton Application和代码示例(特别是https://github.com/maglnet/MaglLegacyApplication),我已经解决了大部分问题。

我无法解决的一个大问题是以下"遗产"文件:

<?php
$test = "test";

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

echo_test();

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

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

...我回来了test = NULL

我已经看到警告说ZF2名称空间可能会为遗留文件带来问题,并完成我的工作以尝试澄清原因。根据PHP指南,"Without any namespace definition, all class and function definitions are placed into the global space"。实际上,我的样本只比本声明下面列出的样本稍微复杂一点......但它似乎没有用。

我也看到&#34; You can set a variable after declaring a namespace, but variables will always exist in the global scope. They are never bound to namespaces.&#34;。

我继续研究,终于发现了这种方法&#34; will import the contents of the include file into the method scope, not the class scope&#34;。

有没有办法在方法范围之外处理文件?

2 个答案:

答案 0 :(得分:0)

这与PHP名称空间无关。如果您在ZF控制器操作中包含文件,它将在该函数的可变范围内执行。为了让你的例子工作,你需要在包含文件之前在ZF动作中声明global $test;(这将是可怕的)。

如果不确切知道遗留代码的样子,很难提出一个好的解决方案。如果你需要使用一定数量的全局变量,你可以在ZF应用程序的早期某个时候对它们进行全局化(目的是在以后删除该hack)。如果您事先不知道全局变量是什么,或者是否存在大量全局变量,则可能需要编辑遗留代码以尝试重构对全局变量的依赖。

答案 1 :(得分:0)

另一种选择(至少在理论上)是使用exec()shell_exec()passthru()(自动打印输出)或卷曲(请参阅shell_exec链接,但仅限于您&#39;在ZF2之外重新托管它以避免无限循环)。这种方法有其自身的缺点列表,包括: