在index.php
我有以下代码
require 'Bootstrap.php';
require 'Variables.php';
function __autoload($class){
$class = str_replace('Control\\', '', $class);
require_once 'class/'.$class.'.php';
}
$bootstratp = new Control\Bootstrap();
on Bootstrap.php
namespace Control;
class Bootstrap{
function __construct(){
Constructor::load_html();
self::same_namespace_different_class();
}
static function same_namespace_different_class(){
Variables::get_values();
}
}
class/Constructor.php
中的
class Constructor{
static function load_html(){
echo 'html_loaded';
}
static function load_variables(){
echo 'load variables';
}
}
和Variables.php
namespace Control;
class Variables{
static function get_values(){
Constructor::load_variables();
}
}
假设,我总共有4个PHP文件,包括3个2个不同命名空间的Class文件。我在__autoload
上还有一个index.php
功能,可以调用来自' class'文件夹,但我的'控制'命名空间文件位于根文件夹中。
当我回复__autoload
中的班级名称时,我会得到以' Control\
'开头的所有班级名称。即使我从全局命名空间调用一个类。
我收到以下错误
Warning: require_once(class/Variables.php): failed to open stream: No such file or directory in _____________ on line 10
我的代码有什么问题?
答案 0 :(得分:1)
当我在__autoload中回显班级名称时,我会得到以' Control \'开头的所有班级名称。即使我从全局命名空间调用一个类。
这是因为在Bootstrap.php
中,所有代码都在Control
命名空间(namespace Control
)中。所以当你使用:
Variables::get_values();
你打电话
\Control\Variables::get_values();
如果你想在全局命名空间中使用Variables
,你应该在这里使用:
\Variables::get_values();
当然,在Variables.php
文件中也是如此:
Constructor::load_variables();
由于构造函数是在全局命名空间中定义的(在class/Constructor.php
中没有使用命名空间),所以您应该使用以下命令访问它:
\Constructor::load_variables();
如果还不清楚,您还可以查看有关namespaces in PHP.的问题
您还应该注意不建议使用__autoload
。您现在应该使用spl_autoload_register()
。 Documentation about autoloading