PHP自動載入下 PSR4

2022-03-20 17:33:16 字數 3616 閱讀 3624

php-fig,它的**是:www.php-fig.org。就是這個聯盟組織發明和創造了psr規範,其中自動載入涉及其中兩個規範,乙個是psr0,乙個是psr4, psr0規範已經過時了,官方有提示,現在主要是用psr4規範定義自動載入標準。

這個 psr 描述的是通過檔案路徑自動載入類的指南;它作為對 psr-0 的補充;根據這個 指導如何規範存放檔案來自動載入;

術語「類」是乙個泛稱;它包含類,介面,traits 以及其他類似的結構;

完全限定類名應該類似如下範例:

()*

完全限定類名必須有乙個頂級命名空間(vendor name);

完全限定類名可以有多個子命名空間;

完全限定類名應該有乙個終止類名;

下劃線在完全限定類名中是沒有特殊含義的;

字母在完全限定類名中可以是任何大小寫的組合;

所有類名必須以大小寫敏感的方式引用;

當從完全限定類名載入檔案時:

在完全限定類名中,連續的乙個或幾個子命名空間構成的命名空間字首(不包括頂級命名空間的分隔符),至少對應著至少乙個基礎目錄。

在「命名空間字首」後的連續子命名空間名稱對應乙個「基礎目錄」下的子目錄,其中的命名 空間分隔符表示目錄分隔符。子目錄名稱必須和子命名空間名大小寫匹配;

終止類名對應乙個以 .php 結尾的檔案。檔名必須和終止類名大小寫匹配;

自動載入器的實現不可丟擲任何異常,不可引發任何等級的錯誤;也不應返回值;

完全限定類名

命名空間字首

基礎路徑

完全路徑

\acme\log\writer\file_writer

acme\log\write

./acme-log-writer/lib/

./acme-log-writer/lib/file_writer.php

\aura\web\response\status

aura\web

/path/to/aura-web/src/

/path/to/aura-web/src/response/status.php

\symfony\core\request

symfony\core

./vendor/symfony/core/

./vendor/symfony/core/request.php

\zend\acl

zend

/usr/includes/zend/

/usr/includes/zend/acl.php

大家注意看第二列和第四列,命名空間字首對應基礎路徑,命名空間字首之後的子命名空間必須對應**目錄(類名必須是php檔案)

上一節中封裝自動載入的方法比較簡單,無法自動載入帶命名空間的類

spl_autoload_register(function ($class) 

// 獲取去掉命名空間字首後的類名

$relative_class = substr($class, $len);

// 將命名空間的中的分隔符替換為目錄分隔符,再加上基礎目錄和.php字尾,最終拼接成

// 檔案路徑

$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';

// 如果檔案存在則require

if (file_exists($file))

});

但是上面的方法只能適用固定的命名空間字首,不能通用。

<?php

namespace example;

/** * 下面這個例子實現了乙個命名空間字首對應多個基礎目錄

* * 現在我們的目錄結構是下面這樣:

* * /demo/autoload/

* controller/

* democontroller.php # foo\bar\democontroller

* admin/

* admincontroller.php # foo\bar\admin\admincontroller

* model/

* demomodel.php # foo\bar\demomodel

* admin/

* adminmodel.php # foo\bar\admin\adminmodel

* * foo\bar分別對應基礎路徑 /demo/autoload/controller 和 /demo/autoload/model

*/class psr4autoloaderclass

/***

* 新增乙個基礎路徑對應乙個命名空間字首

** @param string $prefix 命名空間字首.

* @param string $base_dir 命名空間類檔案的基礎路徑

* @param bool true為往陣列頭部新增元素,false為往陣列尾部新增元素

* @return void

*/public function addnamespace($prefix, $base_dir, $prepend = false)

// 將命名空間字首和基礎路徑存入陣列

if ($prepend) else

}/**

* 真正包含檔案方法,將給到類名檔案包含進來

** @param string $class 全限定類名(包含命名空間).

* @return 成功將返回檔案路徑,失敗則返回false

*/public function loadclass($class)

//去掉右邊的\

$prefix = rtrim($prefix, '\\');

}return false;

}/**

* 如果引數中的$prefix在$this->prefixes中存在,那麼將迴圈$this->prefixes[$prefix]裡的value(基礎路徑)

* 之後拼接檔案路徑,如果檔案存在將檔案包含進來

** @param string $prefix 命名空間字首.

* @param string $relative_class 真正的類名(不包含命名空間路徑的類名).

* @return mixed 包含成功返回檔案路徑,否則返回false

*/// 將陣列中所有的基礎路徑中的檔案包含進來

foreach ($this->prefixes[$prefix] as $base_dir)

}// 沒有找到檔案

return false;

}/**

*如果檔案存在則包含進來.

** @param string $file 檔案路徑.

* @return bool

*/protected function requirefile($file)

return false;

}}

PSR 4 自動載入

翻譯自 這個 psr 描述的是通過檔案路徑自動載入類的指南,它作為對 psr 0 的補充 根據這個來規範存放檔案以實現自動載入 術語class包含類class,介面inte ce,特性traits以及其他一些類似的結構 乙個完整的限定類名應該按照如下範例 當通過乙個完整的限定類名引入乙個檔案時 自動...

PSR 4 自動載入

autoloader 本 psr 是關於由檔案路徑 自動載入 對應類的相關規範,本規範是可互操作的,可以作為任一自動載入規範的補充,其中包括 psr 0,此外,本 psr 還包括自動載入的類對應的檔案存放路徑規範。2.詳細說明 此處的 類 泛指所有的class類 介面 traits可復用 塊以及其它...

PSR4自動載入

psr描述了類名和檔案路徑自動載入。1 class 指的是 class inte ce trait 以及其他類似結構體 2 乙個合格的類名應該是下面格式 必須有乙個頂級命名空間 可以包括一級或多級子命名空間的名字 必須包括乙個最終的類名 下劃線在這裡沒有任何特殊含義 類名大小寫敏感 3 例子 完整合...