【问题标题】:Zend 2 Imports and Global NamespaceZend 2 导入和全局命名空间
【发布时间】:2014-12-02 11:17:13
【问题描述】:

我正在尝试在 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 模块的控制器中,我使用输出缓冲区捕获包含的输出并将其粘贴到响应对象中:

...
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"。确实,我的示例仅比该语句下方列出的示例稍微复杂...但它似乎不起作用。

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

我继续研究,终于发现这种方法“will import the contents of the include file into the method scope, not the class scope”。

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

【问题讨论】:

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


    【解决方案1】:

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

    如果不确切知道您的遗留代码是什么样子,就很难提出一个好的解决方案。如果您需要处理一定数量的全局变量,您可以在 ZF 应用程序的早期某个时间点将它们全局化(目标是在以后删除该黑客行为)。如果您事先不知道全局变量是什么,或者它们的数量很多,您可能需要编辑遗留代码以尝试重构对全局变量的依赖。

    【讨论】:

    • 是的。这与我最终得出的结论相同。在某个时刻,在全局范围内可以访问近 700 个唯一变量。尽管它很可怕,但它可以快速地 grep、删除重复项并将它们全部全局化。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 2012-06-07
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多