【问题标题】:"global" does not work in CakePHP 2.1.1 views“全局”在 CakePHP 2.1.1 视图中不起作用
【发布时间】:2012-03-30 17:32:35
【问题描述】:

我正在使用 PHP 5.3.8 和 CakePHP 2.1.1。

这是我的视图(布局是空的,实际上它只输出视图本身)

<?php   
// $present is not a view variable
$present = 'Hello World!';

class ApplicationsPDF
{   
    public function CreateApplicationTable()
    {
        global $present;
        exit(var_dump($present));
    }
}


$pdf = new ApplicationsPDF();
$pdf->CreateApplicationTable();
?>

输出是null,而不是“Hello World!”。

如果我将此代码复制并粘贴到单个文件中(我直接从浏览器运行),它会完美运行!

所以它一定是一个 CakePHP 错误。有人知道吗?

【问题讨论】:

  • 我无法想象以前从未发现过如此重要的错误,但在 5.3.9+ 更改日志中没有任何相关内容。我不得不想象这与您当地的环境有关。你在使用 auto_prepend_file 来处理任何事情吗?
  • 否,但上面的代码是从 CakePHP 2.1.1 运行的。我刚刚发现代码完全独立运行。我将编辑问题。 (我知道 Stackoverflow 不是错误跟踪器,但我不想删除这个问题)
  • 我知道这不是重点,但你为什么认为你需要使用全局变量?为什么不将$present 传递给构造函数并设置一个类变量?
  • @Madmartigan 你完全正确!我已经想重构它,但后来我发现了这个错误 ;)
  • 是的,上面贴的代码是我的完整视图文件(将代码减少到bug之后)。

标签: php php-5.3 global


【解决方案1】:

尽量在类定义前声明全局关键字:

global $present;

class ApplicationsPDF
{   
    public function CreateApplicationTable()
    {
        exit(var_dump($present));
    }
}

【讨论】:

  • 这不起作用并在CreateApplicationTable() 中给我一个Undefined variable 错误。
  • 您没有删除$present 变量声明部分,是吗?
  • 我没有,但$present 永远不会被定义(它不是视图变量)。
【解决方案2】:

这不是 PHP 也不是 CakePHP 错误!

这是因为 CakePHP 在其视图类中包含了视图,所以声明的变量并不真正在全局范围内,global 没有任何作用。

来自 ADmad (source):

当您自己运行文件时,您的分配 $testVar = 'Hello 世界!'是在全球范围内,因此事情会像你预期的那样工作 到。但是当它用作视图文件时,该文件包含在一个 查看类函数,因此它不再在全局上下文和 $testVar 不再是全局变量,因此您的期望不正确。使用 无论如何,OOP 框架中的全局变量都是一个坏主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    相关资源
    最近更新 更多