php的命名空间和C#的命名空间的概念是同样的。
为何使用命名空间:
命名空间就是避免在同一个项目中使用了相同的类名而引发冲突。
一个namespace就至关于对应一个文件路径,查找这个类的时候就会去对应的文件路径下查找类定义文件。也只是至关于文件路径,在使用的时候还须要手动引入或使用自动加载。
例:
namesp1.php:
<?php
namespace my\name; //声明所属的namespace
class A{
..........
}php
namesp2.php:
<?php
namespace you\name; //
class A{
..........
}app
test.php:
<?php
require('namespace1.php'); //命名空间只是用于区别不一样的类,use并不能实现引入的功能,因此须要手动引入。
require('namespace2.php');
use my\name as myName;
$a = new myName\A(); //使用
$b=new you\name\A();函数
注:一个类若是声明了所属的命名空间,即便引入了类文件也不能直接实例化类的对象,必须使用use,或在实例化的时候加上所属的命名空间。ui
=================spl_autoload==================spa
spl_autoload_register 函数的功能就是把传入的函数(参数能够为回调函数或函数名称形式)注册到 SPL __autoload 函数队列中,并移除系统默认的 __autoload() 函数。code
一旦调用 spl_autoload_register() 函数,当调用未定义类时,系统就会按顺序调用注册到 spl_autoload_register() 函数的全部函数,而不是自动调用 __autoload() 函数。对象
=================PSR-4规范==================blog
PSR-1~3就不说了,说一下被普遍使用的PSR-4,它 是关于由文件路径自动载入对应类的相关规范,规范规定了一个彻底限定类名须要具备如下结构:队列
\<顶级命名空间>(\<子命名空间>)*\<类名>
若是继续拿上面的例子打比方的话,顶级命名空间至关于公司,子命名空间至关于职位,类名至关于人名。那么李彦宏标准的称呼为 "百度公司 CEO 李彦宏"。回调函数
PSR-4 规范中必需要有一个顶级命名空间,它的意义在于表示某一个特殊的目录(文件基目录)。子命名空间表明的是类文件相对于文件基目录的这一段路径(相对路径),类名则与文件名保持一致(注意大小写的区别)。
举个例子:在全限定类名 \app\view\news\Index 中,若是 app 表明 C:\Baidu,那么这个类的路径则是 C:\Baidu\view\news\Index.php
咱们就以解析 \app\view\news\Index 为例,编写一个简单的 Demo:
$class = 'app\view\news\Index'; /* 顶级命名空间路径映射 */ $vendor_map = array( 'app' => 'C:\Baidu', ); /* 解析类名为文件路径 */ $vendor = substr($class, 0, strpos($class, '\\')); // 取出顶级命名空间[app] $vendor_dir = $vendor_map[$vendor]; // 文件基目录[C:\Baidu] $rel_path = dirname(substr($class, strlen($vendor))); // 相对路径[/view/news] $file_name = basename($class) . '.php'; // 文件名[Index.php] /* 输出文件所在路径 */ echo $vendor_dir . $rel_path . DIRECTORY_SEPARATOR . $file_name;
经过这个 Demo 能够看出限定类名转换为路径的过程。