国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【PHP高級特性】ArrayAccess 接口

mrli2016 / 479人閱讀

摘要:提供了個常用的預定義接口,實現某些特定的能力。是啥如官方文檔所述,它提供像訪問數組一樣訪問對象的能力的接口。它提供了個接口我們實現這個接口,依次對應數組的讀取,設置,操作。用上了它,可以讓一個類即可以支持對象引用,也支持數組引用。

php提供了6個常用的預定義接口,實現某些特定的能力。其中最最常用的就是 ArrayAccess 了,像 Laravel 這種流行的框架都用到了它。

ArrayAccess 是啥

如官方文檔所述,它“提供像訪問數組一樣訪問對象的能力的接口”。

它提供了4個接口

/**
 * Interface to provide accessing objects as arrays.
 * @link http://php.net/manual/en/class.arrayaccess.php
 */
interface ArrayAccess {

    /**
     * Whether a offset exists
     * @link http://php.net/manual/en/arrayaccess.offsetexists.php
     * @param mixed $offset 

* An offset to check for. *

* @return boolean true on success or false on failure. *

*

* The return value will be casted to boolean if non-boolean was returned. * @since 5.0.0 */ public function offsetExists($offset); /** * Offset to retrieve * @link http://php.net/manual/en/arrayaccess.offsetget.php * @param mixed $offset

* The offset to retrieve. *

* @return mixed Can return all value types. * @since 5.0.0 */ public function offsetGet($offset); /** * Offset to set * @link http://php.net/manual/en/arrayaccess.offsetset.php * @param mixed $offset

* The offset to assign the value to. *

* @param mixed $value

* The value to set. *

* @return void * @since 5.0.0 */ public function offsetSet($offset, $value); /** * Offset to unset * @link http://php.net/manual/en/arrayaccess.offsetunset.php * @param mixed $offset

* The offset to unset. *

* @return void * @since 5.0.0 */ public function offsetUnset($offset); }

我們實現這4個接口,依次對應數組的isset,讀取,設置,unset操作。

有什么用

定義說的很明白啦,提供像訪問數組一樣訪問對象的能力。用上了它,可以讓一個類即可以支持對象引用,也支持數組引用。

代碼實現示例

class Container implements ArrayAccess
{

    /**
     * @var array 單例對象索引
     */
    private $instances = [];

    /**
     * @var array 可實例化對象定義索引
     */
    private $definitions = [];

    public function offsetExists($offset)
    {
        return isset($this->definitions[$offset]);
    }

    public function offsetGet($offset)
    {
        if (isset($this->instances[$offset])) {
            return $this->instances[$offset];
        } elseif (isset($this->definitions[$offset])) {
            return $this->make($offset);
        }

        throw new Exception("未提供對象定義");
    }

    public function offsetSet($offset, $value)
    {
        // ... 省略一些較驗判斷
        $this->definitions[$offset] = $value;
    }

    public function offsetUnset($offset)
    {
        unset($this->definitions[$offset]);
        unset($this->instances[$offset]);
    }

    private function make($offset)
    {
        $definition = $this->definitions[$offset];

        if ($definition instanceof Closure) {
            return $this->instances[$offset] = $definition();
        }

        if (is_object($definition)) {
            return $this->instances[$offset] = $definition;
        }

        if (is_array($definition)) {
            $class = $definition["class"];
            $reflection = new ReflectionClass($class);

            $dependencies = [];
            // ... 省略反射的實現代碼
            $object = $reflection->newInstanceArgs($dependencies);
            return $this->instances[$offset] = $object;
        }

        throw new Exception("對象定義不合法");
    }
}

使用示例

$container = new Container();

$container["test"] = function () {
  return "this is a test";
};

var_dump(isset($container["test"]));

echo $container["test"];

unset($container["test"]);

參考

預定義接口

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29691.html

相關文章

  • PHP SPL 筆記

    摘要:界面包含四個必須部署的方法下面就是一個部署界面的實例使用方法如下運行結果如下可以看到,雖然是一個,但是完全可以像那樣操作。示例如下類也支持類方法和方法類和類類和類,只支持遍歷一維數組。 這幾天,我在學習PHP語言中的SPL。 這個東西應該屬于PHP中的高級內容,看上去很復雜,但是非常有用,所以我做了長篇筆記。不然記不住,以后要用的時候,還是要從頭學起。 由于這是供自己參考的筆記,不是教...

    hoohack 評論0 收藏0
  • PHP - Pimple 源碼筆記(上)

    摘要:也就是閑時為了寫文章而寫的一篇關于源碼的閱讀筆記。是標準庫的縮寫,一組旨在解決標準問題的接口和類的集合。提供了一套標準的數據結構,一組遍歷對象的迭代器,一組接口,一組標準的異常,一系列用于處理文件的類,提供了一組函數,具體可以查看文檔。 也就是閑時為了寫文章而寫的一篇關于 Pimple 源碼的閱讀筆記。Pimple 代碼有兩種編碼方式,一種是以 PHP 編寫的,另一種是以 C 擴展編寫...

    cfanr 評論0 收藏0
  • 【SPL標準庫專題(3)】Classes

    摘要:我把分為五個部分,,,,而其中是就是做一些類的介紹與相關的類在各自文章內,在介紹這些類之前,先介紹幾個接口數組式訪問接口只要實現了這個接口,就可以使得像那樣操作。只有內部的類用寫的類才可以直接實現接口代碼中使用或接口來實現遍歷。 我把SPL分為五個部分:Iterator,Classes,Exceptions,Datastructures,Function;而其中classes是就是做一...

    binaryTree 評論0 收藏0
  • ArrayAccess使用詳解和實現配置化程序

    摘要:簡介數組式訪問接口提供像訪問數組一樣訪問對象的能力的接口。下面我帶你們一起看看我是這么實現的在項目更目錄下創建一個目錄在目錄下創建相應的配置文件,比如和。 簡介 ArrayAccess(數組式訪問)接口:提供像訪問數組一樣訪問對象的能力的接口。 提供接口 ArrayAccess { //檢查一個偏移位置是否存在 abstract public boolean offse...

    李濤 評論0 收藏0
  • PHP 依賴注入

    摘要:通常調用一個類里面的方法需要如何操作依賴注入模式用來減少程序間的耦合依賴注入共有三種模式方法注入著重說下方法注入并結合單例注冊的服務數組訪問接口測試郵件發送成功方式訪問通過數組的方式訪問也是通過該方式實現依賴 通常調用一個類里面的方法需要如何操作: $class = new class();$class->fun() 依賴注入模式用來減少程序間的耦合 依賴注入共有三種模式: sette...

    zengdongbao 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<