【问题标题】:PHP $var undefined when using multiple require()使用多个 require() 时 PHP $var 未定义
【发布时间】:2011-09-01 11:10:28
【问题描述】:

我在 settings.php 文件中设置了一个 $baseurl。

在我的 index.php 中,settings.php/header.php/masthead.php 连续有 3 个 require()。

当我回显 $baseurl 时,它是未定义的。如果我在 header.php 中定义 $baseurl,那么它可以在 header.php 文件中使用。

如何在 settings.php 文件中定义 $baseurl 并在每个 require() 中使用?

【问题讨论】:

  • 澄清一下:您需要 settings.php,然后是 header.php,然后是 masthead.php。 $baseurl 在 settings.php 中定义,但在 header.php 中未定义?在 header.php 中,引发未定义变量错误的行发生了什么?它在函数内部吗?

标签: php undefined require


【解决方案1】:

包含顺序

设置$baseurl 的文件必须首先是require_once(),以便后续文件可以访问该变量。

功能范围

如果您在函数中定义$baseurl,或者文件是函数内的require_once(),则$baseurl 将被困在该函数范围内。如果settings.php 看起来像这样,就会出现这种情况:

<?php
function setup_config() {
    $baseurl = 'http://www.example.org';
}

或者在函数中要求

<?php
function include_a_file($file) {
    require_once 'my/base/path/' . $file;
}

这记录在 PHP 手册的 Variable Scope 部分。

解决此问题的一种方法是将$baseurl 作为元素添加到$GLOBALS array 中,而不是作为独立变量:

$GLOBALS['config']['baseurl'] = 'my/base/url/';

注意我已将 ['config'] 元素添加到您的配置的命名空间中,远离您可能想要放置在 $GLOBALS 中的任何其他内容。

变量unset()

另一种可能性是您可能在代码中的其他位置调用unset($baseurl),这会将变量标记为未定义。

【讨论】:

  • 太棒了。谢谢你。对我的 settings.php 文件使用 require_once 解决了它。非常感谢您的深入回复。
  • 说得太早了。仍然无法使其正常工作。调用 $GLOBALS[] 时仍然未定义。
【解决方案2】:

如果您在settings.php 中定义它,它应该在所有包含的脚本的全局范围内 可用。当您输入一个函数时,范围会发生变化,因此该变量将不可用,除非您通过在函数开头声明 global $baseurl; 来“导入”它(但不建议这样做)。

【讨论】:

    【解决方案3】:

    如果首先包含settings.php,并将$baseurl 定义为settings.php 中的全局变量,则它将在所有后续包含的文件中可用。如果变量是在settings.php 的函数内定义的,则需要将其定义为全局变量:

    $GLOBALS['baseurl'] = 'theurl';
    

    如果在任何后续包含的文件中的函数内访问它,也需要通过$GLOBALS[] 访问它:

    echo $GLOBALS['baseurl'];
    

    如果您希望从多个文件访问全局变量,强烈建议始终使用$GLOBALS[] 数组,因为在任何范围内都可以清楚地知道正在设置和访问该变量全球。

    【讨论】:

      【解决方案4】:

      如果您 require() 函数中的文件,则变量在函数范围内定义:它们不是全局的。

      在 settings.php 中使用$GLOBALS['baseurl'] = '...';

      【讨论】:

        猜你喜欢
        • 2015-04-26
        • 2017-09-25
        • 2020-02-11
        • 2019-12-14
        • 2013-11-20
        • 1970-01-01
        • 2021-09-15
        • 2017-11-03
        • 1970-01-01
        相关资源
        最近更新 更多