PHP規範PSR11(依賴注入容器介面)介紹
本文件描述了依賴注入容器的通用介面。
ContainerInterface設定的目標是標準化框架和庫如何使用容器來獲取物件和引數(在本文件的其餘部分中稱為條目)。
本文件中的關鍵詞“必須”,“必須”,“必需”,“應該”,“不應該”,“應該”,“不應該”,“推薦”,“可以”和“可選”按照RFC 2119中的描述進行解釋。
本文件中的單詞實現者將被解釋為在依賴注入相關的庫或框架中實現ContainerInterface的人。依賴注入容器(DIC)的使用者稱為使用者。
1 規格
1.1 基礎知識
1.1.1 條目識別符號
條目識別符號是至少一個字元的任何PHP合法字串,用於唯一標識容器中的專案。條目識別符號是不透明的字串,因此呼叫者不應該假設字串的結構帶有任何語義含義。
1.1.2 從容器中讀取
Psr \ Container \ ContainerInterface公開了兩個方法:get和has。
get需要一個必需引數:一個條目識別符號,它必須是一個字串。 get可以返回任何內容(混合值),或者如果容器不知道識別符號,則丟擲NotFoundExceptionInterface。使用相同識別符號的兩次連續呼叫應該返回相同的值。但是,根據實現者設計和/或使用者配置,可能會返回不同的值,因此使用者不應該依賴於在2次連續呼叫中獲取相同的值。
有一個唯一的引數:一個條目識別符號,它必須是一個字串。如果容器已知條目識別符號,則必須返回true,否則返回false。如果has($ id)返回false,則get($ id)必須丟擲NotFoundExceptionInterface。
1.2 例外情況
容器直接丟擲的異常應該實現Psr \ Container \ ContainerExceptionInterface。
使用不存在的id呼叫get方法必須丟擲Psr \ Container \ NotFoundExceptionInterface。
1.3推薦用法
使用者不應該將容器傳遞給物件,以便物件可以檢索自己的依賴項。這意味著容器用作服務定位器,這是一種通常不鼓勵的模式。
有關詳細資訊,請參閱META文件的第4部分。
2 包裝
描述的介面和類以及相關的異常作為psr / container包的一部分提供。
提供PSR容器實現的包應宣告它們提供psr / container-implementation 1.0.0。
需要實現的專案應該要求psr / container-implementation 1.0.0。
3 介面
3.1. Psr\Container\ContainerInterface
<?php
namespace Psr\Container;
/**
* Describes the interface of a container that exposes methods to read its entries.
*/
interface ContainerInterface
{
/**
* Finds an entry of the container by its identifier and returns it.
*
* @param string $id Identifier of the entry to look for.
*
* @throws NotFoundExceptionInterface No entry was found for **this** identifier.
* @throws ContainerExceptionInterface Error while retrieving the entry.
*
* @return mixed Entry.
*/
public function get($id);
/**
* Returns true if the container can return an entry for the given identifier.
* Returns false otherwise.
*
* `has($id)` returning true does not mean that `get($id)` will not throw an exception.
* It does however mean that `get($id)` will not throw a `NotFoundExceptionInterface`.
*
* @param string $id Identifier of the entry to look for.
*
* @return bool
*/
public function has($id);
}
3.2. Psr\Container\ContainerExceptionInterface
<?php
namespace Psr\Container;
/**
* Base interface representing a generic exception in a container.
*/
interface ContainerExceptionInterface
{
}
3.3. Psr\Container\NotFoundExceptionInterface
<?php
namespace Psr\Container;
/**
* No entry was found in the container.
*/
interface NotFoundExceptionInterface extends ContainerExceptionInterface
{
}