PHP名空间简介,命名空间不难学

php命名空间是为了避免同名类和函数,最开使用的时候一头雾水,怎么也加载不了类文件,其实根本原因是说明文档讲复杂了。

首先要知道加载机制是什么

加载机制就是在实例化一个类的时候,如果这个类没有在内存中,php就会调用以下方法。

加载机制第一种方法

//类库载入配置
spl_autoload_register(function($name){
	if (is_file($path = './lib/' . $name . '.php') || is_file($path = './libx/' . $name . '.php')) require_once $path;
});

加载机制第二种方法

这种方法在命名空间中经会失效,在调试中如果不行用第一种方法是比较稳当的。

//类库载入配置
function __autoload($name){
	if (is_file($path = './lib/' . $name . '.php') || is_file($path = './libx/' . $name . '.php')) require_once $path;
};

定义namespace

如:

<?php
namespace core;
class App{
	static public $mvc_module 	= 'w';
    public static function register(){
    }

访问实例化类文件

第一种情况,访问的时候没有设定命名空间

$app=new core\App;
//或
core\App::register();
//或
$app=new \core\App;
//或
\core\App::register();

就会加载 根文件下的 ‘./lib/core/App.php’ 或 ‘./libx/core/App.php’ 然后实例化 App;

第二种情况设定了命名空间

如果类名前缀的第一个字符是’\’ 如:

namespace core;
$app=new \App
//就会加载 根文件下的 './lib/App.php' 或 './libx/App.php' 然后实例化 App;或
$app=new \core\App
//就会加载 根文件下的 './lib/core/App.php' 或 './libx/core/App.php' 然后实例化 App;

如果类名前缀的第一个字符不是’\’ 如:

namespace core;
$app=new App
//就会加载 根文件下的 './lib/core/App.php' 或 './libx/core/App.php' 然后实例化 App;(说明:App类的名空间写法是 namespace core)或
$app=new core\App
//就会加载 根文件下的 './lib/core/core/App.php' 或 './libx/core/App.php' 然后实例化 App(说明:App类的名空间写法必须是 namespace core\core);

这样基本就完了,如果还有点蒙,就推荐以下方法

调试方法推荐

//类库载入配置
spl_autoload_register(function($name){
	var_dump($name);//就可以观察其变化情况,反正引入了就行;
});