【问题标题】:Global variable isn't accessible inside my Wordpress function. Why not?在我的 Wordpress 函数中无法访问全局变量。为什么不?
【发布时间】:2015-03-01 04:26:21
【问题描述】:

我在wordpress 中工作,并且在functions.php 中有一个函数。这是为了根据使用变量的上下文设置一些变量。但是有一个问题。

我在包含的模板文件中使用该函数,该函数旨在处理包含模板文件的页面上的变量。我在函数中将所有变量声明为全局变量,但函数无法识别变量的值。我不明白为什么会这样,因为我确信变量范围被正确使用了。

为了消除混淆,我在下面包含了一个简化的代码示例,显示了此问题涉及的三个文件。如果有人知道为什么会发生这种情况,我会很高兴听到它。我有兴趣了解它发生的原因,而不是寻找解决方法。

functions.php

function set_variables() {
    global $data;
    print_r($data);
}

included_file.php

set_variables();
(Code that sets other variables and works with HTML)

template_file.php

$data = "Test";
include "included_file.php";

上面代码的结果是什么都没有——我无法让functions.php中的函数识别template_file.php中定义的变量。但是,如果我在 functions.php 中定义 $data 变量,它就可以工作。

就像我说的,这让我感到困惑,因为它似乎与在函数中声明全局变量的工作方式相矛盾。我怎么弄错了?

【问题讨论】:

  • 嗯...set_variable()set_variables() 不是一回事
  • 真的是全球性的吗?你怎么知道?顺便说一句,你为什么需要一个全局变量 - 为什么不将它作为参数传递?
  • @Machavity - 这是创建示例时的错误 - 代码本身很好,但很冗长。我不想粘贴很多代码。
  • @zerkms - 我在函数中声明了全局变量,在另一个文件中使用了该函数,然后将该文件包含在模板中。我假设模板文件中声明的变量相对于函数调用是全局的。显然我在某个地方犯了一个错误,不知道是什么。
  • @user3628576 对于全局变量,它必须声明为global 任何地方使用它。或者它必须放在全局范围内。就这么简单,没错。

标签: php wordpress global-variables php-include


【解决方案1】:

您似乎拼错了调用函数:

set_variable() 与 set_variables() 不同

请注意 PHP 中关于包含文件的以下内容:

当一个文件被包含时,它包含的代码继承了包含发生的行的变量范围。从那时起,调用文件中该行的任何可用变量都将在被调用文件中可用。但是,包含文件中定义的所有函数和类都具有全局范围。

见:http://php.net/manual/en/function.include.php

【讨论】:

  • “包含的文件强制执行全局范围”——这不是真的。
  • 您的编辑也不正确。请仔细阅读报价的最后一句话。
  • @Stephn_R - 感谢您的反馈,但这是我在创建示例时的错误。上面的代码是文件内部发生的事情的简化版本。不是我的实际代码。我的问题是针对在函数内部声明为全局变量不可用的现象。我只是试图给出代码正在执行的上下文的可视化表示,以试图澄清情况。
【解决方案2】:

@zerkms - 非常感谢您回答我的问题。原来我所要做的就是在定义它的文件中将变量声明为全局变量。

所以,在上面给出的例子中,解决方案如下:

functions.php

function set_variables() {
    global $data;
    print_r($data);
}

included_file.php

set_variables();
(Code that sets other variables and works with HTML)

template_file.php

global $data = "Test";
include "included_file.php";

我只是假设在 template_file.php 中声明的变量在全局范围内,但我想它不是。原因仍然有点模糊,但我知道代码有效,我对此感到非常高兴。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2013-07-03
    • 2017-06-09
    • 2020-06-20
    • 2012-02-26
    • 1970-01-01
    • 2017-05-11
    • 2011-07-23
    • 2016-12-27
    相关资源
    最近更新 更多