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);//就可以观察其变化情况,反正引入了就行; });