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 能夠看出限定類名轉換爲路徑的過程。