php命名空間和use我並不是很熟悉,經過實際例子測試,得出以下結論:在phalapi中,只有頂級命名空間下只有放置在Api、Domain以及Model目錄下的類使用相應的命名空間才能被use後實例化,如果不在這三個目錄下,則需要在composer.json中添加自動加載文件。當然,也可以在config/di.php中註冊di依賴注入服務,需要使用時實例化\PhalApi\DI()->name
即可。以下爲測試過程記錄。
測試不在Api、Domain以及Model目錄下的類使用
在phalapi/src/app目錄下新建一個Test.php,定義命名空間爲App\Test;
//phalapi/src/app/Test.php
namespace App\Test;
class Test{
public function say() {
return 'hello';
}
}
接着在phalapi/src/app/Api下的Hello.php中定義Test接口用於本次測試
//phalapi/src/app/Api/Hello.php
namespace App\Api;
use PhalApi\Api;
use App\Test\Test;
/**
* 測試模塊接口
*/
class Hello extends Api {
/**
* 測試命名空間接口
* @desc 測試命名空間自動加載
* @return string rs 結果
*/
public function test(){
$a = new Test();
return $a->say();
}
}
此時訪問接口?s=App.Hello.Test
會提示uncaught錯誤,即 App\Test\Test類找不到。可見該文件沒有被自動加載,才產生了這種結果。
接下來爲進一步證明,我們將該文件的命名空間修改爲App\Domain進行測試。會發現同樣報錯Uncaught Error: Class 'App\\Domain\\Test' not found
,接下來我們測試將該文件放置到Domain目錄下。
測試在Api、Domain以及Model目錄下的類使用
我們先將該文件放置到Domain目錄下,將命名空間修改爲App\Test。再次在Test接口中訪問,會發現還是提示Uncaught Error: Class ‘App\Test\Test’ not found。這是不是說明命名空間還必須與文件路徑相一致呢?我們將命名空間修改爲App\Domain再次嘗試一下,接口成功返回數據,這一點在官網文檔上已有提示。
測試composer.json中聲明自動加載
接下來我們將Test.php移回app目錄下,命名空間修改爲App\Test,然後在項目根目錄下的composer.json中的添加一條路徑。
"autoload": {
"files": [
"src/app/functions.php",
"src/app/Test.php"//添加的自動加載文件
],
最後仍在Test接口中實例化該類,訪問可正常返回結果。
綜上可見命名空間的自動加載是框架已經定義好的,只有滿足以下兩個條件:
- 類文件放置在Api、Domain以及Model目錄下
- 命名空間需與文件路徑保持一致
除此之外,只能通過di注入或者在composer.json中聲明自動加載纔可使用。