示例:
#/DB/MySql.class.php也就是DB文件夾下有MySql.class.php文件
namespace DB;
class MySql
{
public function __construct()
{
var_dump(__FILE__);
}
}
#/index.php namespace 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等;要在自動查找類的函數方法中進行分析.
