1.瀏覽器提示:
Fatal error: Class '\core\lib\drive\log\file'
not found in /Library/WebServer/Documents/imooc/core/lib/log.php on line 22
仔細檢查這個文件缺失存在,然后查看調用創建類的地方代碼,
并打印
$class = '\core\lib\drive\log\\'.$drive;p($class);
self::$class = new $class;
創建類的時候,
也$class打印 \core\lib\drive\log\file
路徑也是對的.但是就是調試不出來.
仔細檢查發現 file文件的命名空間寫成了\core\lib\log
修改成\core\lib\drive\log
就沒有問題了
這里為什么可以使用命名空間的方法來new 一個類呢? 難道不需要判斷有沒有這個文件或者有沒有導入么? 看第二個TIPS;
2.這里學習一個常識吧,在php類中new 一個類
第一,需要導入這個文件,這里可以使用spl_autoload_register
指定一個調用方法.自動load一個類.
spl_autoload_register('\core\imooc::load');
這段代碼表示當new一個類的時候,會自動導入這個類.具體代碼如下:將命名空間的\替換成路徑的/寫法.去導入文件路徑.
static public function load($class){
//自動加載類庫
if(isset($classMap[$class])){
return true;
}else{
$class = str_replace('\\','/',$class);
$file = IMOOC.'/'.$class.'.php';
///Library/WebServer/Documents/imooc/core/route.php
if(is_file($file)){
include $file;
self::$classMap[$class] = $class;
}else{
//throw "沒有找到文件";
return false;
}
}
p('load ok');
}
第二:所以當new 一個類的時候按照命名空間寫法,會自動觸發spl_autoload_register這個指定的加載方法.
可以這樣寫
$route = new \core\lib\route;
也可以這樣寫:
$route = new \core\lib\route();