【问题标题】:Why is global $var not needed in these PHP functions?为什么这些 PHP 函数不需要全局 $var?
【发布时间】:2016-06-16 07:57:55
【问题描述】:

我有一个 PHP 系统,它没有在函数中使用 global $var; 定义变量的全局范围,并且可以在服务器上工作,但不能在我的本地系统上工作。

这是对 PHP 范围规则的更改,还是有允许这样做的设置?我的本地系统运行的是php 5.5.36,不知道服务器运行的是什么版本。

编辑:添加代码示例

这适用于服务器

include_once("common.inc.php"); // this defines $physical_path

class Admin extends AdminData
{
    function Admin($admin_auth_id='') {
        include_once($physical_path['DB_Access']. 'SubadminCommittee.php');
        // many more lines of code follow
    }
}

这适用于运行 5.5.36 的本地 PHP

include_once("common.inc.php"); // this defines $physical_path

class Admin extends AdminData
{
    function Admin($admin_auth_id='') {
        global $physical_path;  // why is this line not needed on server?
        include_once($physical_path['DB_Access']. 'SubadminCommittee.php');
        // many more lines of code follow
    }
}

【问题讨论】:

  • 请提供代码示例。基于模糊的描述,我们无法对此发表任何评论。
  • @deceze 我添加了一个代码示例,不幸的是我无法在服务器上重现它,而且我没有地方可以创建一个简单的示例。这个系统不是我创建的。

标签: php php-5.5


【解决方案1】:

变量$physical_path在没有global 的函数内可用。这在 PHP 版本或任何类似的东西中没有区别,这是一个明确的范围界定事实,在 PHP 版本之间没有区别。

可能的解释是 $physical_path['DB_Access'] 的计算结果为 null 并引发了一个警告,你忽略了它。因此,include_once 行的计算结果为:

include_once('SubadminCommittee.php');

由于脚本被调用的方式以及当前工作目录的存在,这种相对路径查找在服务器上起作用。在您的本地服务器上,这不起作用,因为您的工作目录不同和/或 PHP 的 PATH 值设置不同。

【讨论】:

  • 我在服务器上设置了一个测试类,并确认 $physical_path 变量为空。正如预期的那样。该变量用于许多其他用途,因此我需要添加全局变量或将其替换为工厂或单例。
  • 你绝对不应该使用global;相反,依赖项将值注入到每个类的构造函数中。
  • 我会在全局变量中使用大量数据以外的东西,但这是旧的 PHP 方式。我可能会将它作为参数传递或提供单例,或使用 Symfony 构建系统并让它执行 DI。
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
相关资源
最近更新 更多