在PHP中调用不同的命名空间或类

时间:2014-08-07 06:29:04

标签: php class namespaces autoload bootstrapping

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

我的代码有什么问题?

1 个答案:

答案 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