標籤:
樣本:
#/DB/MySql.class.php也就是DB檔案夾下有MySql.class.php檔案namespace DB;class MySql{ public function __construct() { var_dump(__FILE__); }}
#/index.phpnamespace Home;use DB\MySql;$mysql = new MySql();
報錯
Fatal error: Class ‘DB\MySql‘ not found in D:\localhost\demo\space\index.php on line 23
修改
修改 index.php 改成如下,可以了,但是為什麼不能自動載入?
namespace Home;use DB\MySql;spl_autoload_register(function ($class) { if ($class) { $file = str_replace(‘\\‘, ‘/‘, $class); $file .= ‘.class.php‘; if (file_exists($file)) { include $file; } }});$mysql = new MySql();
要點:
第一:
命名空間跟檔案載入並無直接關係,只是有些語言,將命名空間結構和檔案結構對應起來了。 以php為例,一般的命名空間結構,跟php檔案結構是存在映射關係的,通過命名空間名稱,就能算出該類的實際儲存位置, 然後執行個體化的時候,會觸發用設定的spl自動載入函數將檔案引入。
(Xee:命名空間是事先通過自動匯入或者include,require之類匯入的,然後會根據命名空間對應起來,實現自動載入)
第二:
namespace Home;use DB\MySql;$mysql = new MySql();
實際執行代碼的時候是 new \DB\MySql(); 找不到這個檔案的時候就會調用你的autoload函數 並file_exists("DB/MySql.class.php"),在目前的目錄下尋找這個檔案,在找不到的情況下然後就是你看到的錯誤
(Xee:在被調用的MySql.class.php檔案中,也要有\DB\MySql的命名空間)
第三:
如果剛開始瞭解php命名空間,去看如何使用PHP命名空間;多翻翻使用命名空間的架構的源碼,如micro-mvc,slim等。
還有PSR-4——新鮮出爐的PHP規範,其中就有這個:
* // register the base directories for the namespace prefix * $loader->addNamespace(‘Foo\Bar‘, ‘/path/to/packages/foo-bar/src‘); * $loader->addNamespace(‘Foo\Bar‘, ‘/path/to/packages/foo-bar/tests‘);
第四:
我們常用 db\mysql,這種形式的命名空間!不是一定要使用\這個反斜線的,還可以使用例如:db::mysql;或者db_mysql等;要在自動尋找類的函數方法中進行分析.
<參考:PHP命名空間 namespace 如何?自動載入>
PHP 使用命名空間(namespace),實現自動載入