1、前言php
對於不少的PHP小白來講,命名空間是什麼,爲何要聲明命名空間呢? 框架
他們老是感到困惑!如下是本人的理解,望對童鞋們有所幫助。yii
2、介紹函數
命名空間是一個函數或者一個類的惟一標識。在流行的框架Lavaral,ThinkPHP,Yii等框架中,特別是結構複雜的文件層次和海量的代碼中,相同的類名和函數名就容易使咱們的程序拋出異常。因而,咱們引進了命名空間的概念。ui
結構以下:spa
1 <?php 2 namespace yii\rest; 3
4 use yii\rest\Controller; 5
6 class ActiveController extends Controller 7 { 8 // ......
9 }
很顯然咱們能夠看出, 命名空間的命名是 以咱們項目的頂級目錄爲開始以路徑的形式命名的。rest
引入咱們的命名空間是 use 短語句,另外也能夠 直接以 1 \yii\rest\Controller 的形式使用。code
除了咱們所說的避免海量代碼出現重複,從而拋出異常的優勢, 命名空間還能夠配合魔術常量 __dir__ 和函數 dirname() 使用,來拼接咱們的函數或類文件的絕對路徑。blog
在不少框架的底層咱們常常能夠看到 spl_autoload_register() 這個函數配合命名空間來加載類文件實現咱們的代碼邏輯。此函數是魔術方法__autoload()的實現。io
下面給出例子:
1 <?php 2
3 // function __autoload($class) { 4 // require_once 'dirname(__dir__)' . "/{$class}.php"; 5 // }
6
7 function my_autoloader($class) { 8 require_once 'dirname(__dir__)' . "/{$class}.php"; 9 } 10
11 spl_autoload_register('my_autoloader'); 12
13 // 或者,自 PHP 5.3.0 起能夠使用一個匿名函數
14 spl_autoload_register(function ($class) { 15 require_once 'dirname(__dir__)' . "/{$class}.php"; 16 });