【问题标题】:Does scope change at all when including class files in a class method in PHP?在 PHP 的类方法中包含类文件时,范围是否会发生变化?
【发布时间】:2016-03-11 03:58:42
【问题描述】:
我觉得问这个问题很愚蠢,但我可以向专家咨询一下在类方法中包含的行为吗?
当我使用require_once 在类方法中包含类定义文件时,我需要注意什么问题。我正在考虑工厂类的自动加载方法,但实际上任何时候方法确实包含或需要。
我的期望是它应该与我在开始时将它们简单地包含在一个包含文件中一样。我对吗?我只问当您在类方法中包含文件时,它会继承方法范围。
【问题讨论】:
标签:
php
class
scope
php-include
【解决方案1】:
需要注意的一点是全局变量的范围。举例:
文件:a.php
<?php
$foo = 'bar';
文件:b.php
<?php
require_once 'a.php';
echo $foo;
文件:c.php
<?php
load_foo();
show_foo();
function load_foo() {
require_once 'a.php';
}
function show_foo() {
require_once 'b.php';
}
现在如果你直接运行b.php(例如php b.php)你会得到正确的输出:
bar
但是,如果你运行 c.php,你会得到:
PHP Notice: Undefined variable: foo in C:\temp\b.php on line 3
PHP Stack trace:
PHP 1. {main}() C:\temp\c.php:0
PHP 2. show_foo() C:\temp\c.php:3
PHP 3. require_once() C:\temp\c.php:9
错误的原因是在c.php 内部,我们在函数load_foo() 中加载了a.php。这会导致变量$foo 被限定为函数load_foo() 的局部 变量,否则它将是一个全局变量。然后当调用show_foo() 时,它会加载b.php,它会跳过require_once(因为我们已经加载了a.php)然后尝试打印$foo。但它不能,因为 $foo 不再定义。当我们 load_foo() 退出时,它超出了范围。
所以,回到你原来的问题 - 如果你使用自动加载并且自动加载发生在函数/方法上下文中,全局变量将在本地范围内,如上面的示例所示。如果您绝对需要使用全局变量,请确保在定义它们之前使用global 关键字(即global $foo 作为上面a.php 的第一行)和在使用它们之前(再次,global $foo在b.php 中的require_once 之后)。