PHP命名空间和全局自动加载单个文件

时间:2013-02-21 18:16:22

标签: php namespaces autoload

这是一个在单个文件中使用PHP命名空间/自动加载的实验。

namespace trust;

class trust_network{        
    public function __construct(){      
        print "SUP";
    }
}

namespace trust2;

$trust = new \trust\trust_network(); $do = new \test();

function __autoload($class){
    require($class.".php");     
    print $class;
}

所以在命名空间trust2下,我正在调用“\ test” - 我也想从全局基础上的外部文件中自动加载该类。我写的不起作用。我知道我在命名空间下有__autoload,但是如何在全局范围内声明?在命名空间声明之前不能包含。

2 个答案:

答案 0 :(得分:3)

对于一个文件中的多个名称空间,您应该使用大括号语法:

namespace n1 {
...
}
namespace n2 {
...
}
namespace {
...
}

在最后一个块中,您可以在全局命名空间中声明函数。参考:http://www.php.net/manual/en/language.namespaces.definitionmultiple.php

答案 1 :(得分:2)

自动加载通常是这样你可以为每个文件放一个类。因此,您应该具有以下布局

<强>的index.php

function __autoload($class){
    // You may need to convert backslashes in $class to forward slashes 
    // and strip the first slash, we'll leave the
    require($class.".php");
    // debug-only:  print $class;
}
// Calling new here triggers __autoload to be called
$trust = new \trust\trust_network();
$do = new \test();

<强> /trust/trust_network.php

namespace trust;

class trust_network{        
    public function __construct(){      
        print "TRUST_NETWORK";
    }
}

<强> /test.php

class test() {
    public function __construct(){      
        print "TEST";
    }
}

请注意,您应该使用spl_autoload_register,因为它允许多个系统挂钩他们自己的自动加载行为。从PHP 5.3开始,您可以执行以下操作

spl_autoload_register(function ($class) {
    require($class.".php");
});