【问题标题】:php function global defined variables do not work with Yiiphp 函数全局定义变量不适用于 Yii
【发布时间】:2013-02-19 00:34:01
【问题描述】:

我在尝试将一些遗留代码添加到 Yii 项目时遇到问题。

它与全局变量有关,我很清楚应该将其作为参数传递,但由于这段旧代码用于其他项目,重写它并不是真正的选项。

$testVar = '123';
function testOutput() {
   global $testVar;
   var_dump($testVar);
}
testOutput();

现在,如果我将此文件包含在一个普通的 php 文件中,它可以工作并输出

string '123' (length=3)

但是如果我将此文件包含在 Yii 控制器甚至模板中,它会输出此文件

null

我试图搜索这个问题,但我得到了一堆关于人们错误地使用全局变量的结果。我确信这实际上不是 Yii 问题,但很可能是 Yii 设置的 php_ini 设置,但是在搜索代码或 Yii 文档时我找不到任何可以解释这一点的内容。

可以通过使用我的第一个代码块创建一个文件然后将其包含到 Yii 模板或控制器中来测试这个示例。我什至用一个干净的示例 Yii 项目对其进行了测试。

我希望通过使用 Yii 标记这个问题不会损害我解决这个问题的机会,因为我觉得这不仅仅是一个 Yii 特定的问题。

任何见解将不胜感激。

【问题讨论】:

  • 如果你在函数/类中声明$testVar = 123,它不是全局的。
  • 如果你在函数定义之前在开头做global $testVar; $testVar = 123;,它会起作用,我只是用Yii控制器测试过
  • @MarkoD 你是对的,但这是为什么呢?有任何文档说明为什么需要这样做以及为什么 Yii 框架会导致需要这样做吗?您也将此作为答案,我会接受。
  • 我将其发布为答案。我不知道为什么会这样,我想这和其他人所说的差不多……
  • @byoungb:这是因为最初声明$testVar的作用域不是全局作用域,所以其他作用域将无法访问它。

标签: php yii


【解决方案1】:

如果你这样做,它会工作,我刚刚用 Yii 控制器测试过

global $testVar;
$testVar = '123';
function testOutput() {
   global $testVar;
   var_dump($testVar);
}
testOutput();

【讨论】:

  • 谢谢!!有同样的问题。为什么会这样?你有什么想法吗?
【解决方案2】:

正如 DCoder 所提到的,如果您在类、函数/方法中声明它们,那么它们就不是全局的。您可以尝试将它们分配给 $_GLOBALS 数组:

$GLOBALS['testVar'] = 123;

但是,根据遗留代码以及您如何集成它,您可能需要更改该遗留代码中的所有引用以使用 $GLOBALS['thevar'] 而不是 $thevar 或在部分或全部顶部执行 extract($GLOBALS)遗留文件。

【讨论】:

  • 当前代码使用全局变量,主要用于memcached连接对象和mysqli连接对象,供几个不同的函数和类使用。
【解决方案3】:

谷歌搜索:Global Variables in Yii

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多