有两个类,每个在它自己的文件中:
<?php
namespace test;
class calledClass {
private $Variable;
function __construct() {
global $testVar;
require_once 'config.php';
$this->Variable = $testVar;
echo "test var: ".$this->Variable;
}
}
?>
和
<?php
namespace test;
class callingClass {
function __construct() {
require_once 'config.php';
require_once 'calledClass.php';
new calledClass();
}
}
new callingClass();
?>
和config.php:
<?php
namespace test;
$testVar = 'there is a test content';
?>
当我启动callingClass.php
(创建对象calledClass
)时,calledClass
中的$Variable
属性为空。但是当我手动启动calledClass.php
时,它从config.php
读取$testVar
的含义,并假设它为$Variable
。
如果我在callingClass
中将$testVar
声明为global
, calledClass
可以从config.php
读取$testVar
。
谁能告诉我为什么从另一个对象创建的对象不能声明变量为全局,并使用它们?
当在函数中包含(include
/require
)文件时,该文件中的所有变量声明都获得该函数的作用域。所以$testVar
是在callingClass::__construct
的范围内创建的。由于您使用require_once
,将不会在calledClass::__construct
内的其他地方重新创建!它只在调用calledClass
时有效,因为您实际上是第一次在那里包含该文件。
它与OOP完全无关,只是函数作用域的规则和您对require_once
的特殊使用。