PHP學習——記錄Phalapi中關於命名空間自動加載的測試

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接口中實例化該類,訪問可正常返回結果。


綜上可見命名空間的自動加載是框架已經定義好的,只有滿足以下兩個條件:

  1. 類文件放置在Api、Domain以及Model目錄下
  2. 命名空間需與文件路徑保持一致

除此之外,只能通過di注入或者在composer.json中聲明自動加載纔可使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章