PHP底層ArrayAcces抽象類巧用分析

php arrayaccess 官方的說法是讓你能以數(shù)組的形式訪問對象,對于這種php內(nèi)置接口一直不太明白有什么用举户,堅持多看文章,終于理解遍烦,特來分享俭嘁,思路不同,更易于理解服猪。

(1).創(chuàng)建一個學生類供填,并且實現(xiàn)arrayaccess 接口拐云。

<?php

class  student implements ArrayAccess
{
    public $name = '小美';
    
    private $age = 17;


    public function offsetExists($offset)
    {
        // TODO: Implement offsetExists() method.
    }

    public function offsetGet($offset)
    {
        // TODO: Implement offsetGet() method.
    }

    public function offsetSet($offset, $value)
    {
        // TODO: Implement offsetSet() method.
    }

    public function offsetUnset($offset)
    {
        // TODO: Implement offsetUnset() method.
    }
}

//實例化一個學生小美
$student = new student();

//用對象的方式去訪問學生姓名
echo $student->name.PHP_EOL;

//用對象的方式給學生重新起名字
$student->name = '小茜';

//用對象的方式去訪問學生姓名
echo $student->name,PHP_EOL;
上面是個很簡單的類,初始化這個學生叫小美近她,然后通過對象的方式去訪問和修改對象的屬性叉瘩,修改了學生的姓名。以上代碼分別輸出:

小美
小茜
(2).既然這里要講以數(shù)組的方式訪問對象粘捎,那就來試試數(shù)組訪問對象屬性薇缅,訪問學生的姓名

class  student implements ArrayAccess
{
    public $name = '小美';

    private $age = 17;


    public function offsetExists($offset)
    {
        // TODO: Implement offsetExists() method.
    }

    public function offsetGet($offset)
    {
        var_dump($offset);
    }

    public function offsetSet($offset, $value)
    {
        // TODO: Implement offsetSet() method.
    }

    public function offsetUnset($offset)
    {
        // TODO: Implement offsetUnset() method.
    }
}

//實例化一個學生小美
$student = new student();

//數(shù)組方式訪問學生的姓名
echo $student['name'];

我們直接輸出$student['name']人家并沒有輸出學生小美的名字,而是調(diào)用內(nèi)部的offsetGet方法攒磨,并將我傳遞的name下標傳遞進去泳桦。也就是說實現(xiàn)了ArrayAccess接口的類,如果用數(shù)組的方式訪問對象娩缰,PHP底層先會調(diào)用offsetGet方法灸撰,并且將數(shù)組的下標傳遞進去。那么問題來了拼坎,我怎么用數(shù)組的方式去獲取學生的名字呢浮毯?其實PHP只提供了我們訪問數(shù)組形式訪問對象的能力,但是具體的實現(xiàn)要我們來實現(xiàn)泰鸡。如果真的只是簡單的用數(shù)組形式訪問對象亲轨,那么我們完全可以通過方法將對象轉(zhuǎn)換為數(shù)組。PHP僅僅只提供我們這個能力鸟顺,實現(xiàn)交由我們開發(fā)者,發(fā)揮的空間更大器虾。完全可以自定義讯嫂。

(3)通過上面我們知道一個類實現(xiàn)了ArrayAccess接口,當用數(shù)組形式訪問它兆沙,它會自動調(diào)用offsetGet方法欧芽,那么用數(shù)組形式賦值,它就應該會調(diào)用offsetSet方法葛圃,使用empty方法檢測數(shù)組的key是否存在千扔,它就應該會自動調(diào)用offsetExists方法,使用unset方法刪除數(shù)組的key是否存在库正,它就應該會自動調(diào)用offsetUnset方法曲楚,

class  student implements ArrayAccess
{
    public $name = '小美';

    private $age = 17;


    public function offsetExists($offset)
    {
        return property_exists('student', $offset);
    }

    public function offsetGet($offset)
    {
        return $this->$offset;
    }

    public function offsetSet($offset, $value)
    {
        $this->$offset = $value;
    }

    public function offsetUnset($offset)
    {
        $this->$offset = '';
    }
}

//實例化一個學生小美
$student = new student();

//數(shù)組方式訪問學生的姓名
echo $student['name'].PHP_EOL;

//數(shù)組方式重新給學生起名字,改年齡
$student['name'] = '小倩';
$student['age'] = 12;

//數(shù)組方式訪問姓名和年齡
echo $student['name'].PHP_EOL;
echo $student['age'].PHP_EOL;

那么這個接口還能做什么,有哪些應用場景褥符,下篇文章繼續(xù)講

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末龙誊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喷楣,更是在濱河造成了極大的恐慌趟大,老刑警劉巖鹤树,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逊朽,居然都是意外死亡罕伯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門叽讳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來追他,“玉大人,你說我怎么就攤上這事绽榛∈幔” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵灭美,是天一觀的道長推溃。 經(jīng)常有香客問我,道長届腐,這世上最難降的妖魔是什么铁坎? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮犁苏,結(jié)果婚禮上硬萍,老公的妹妹穿的比我還像新娘。我一直安慰自己围详,他們只是感情好朴乖,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著助赞,像睡著了一般买羞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雹食,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天畜普,我揣著相機與錄音,去河邊找鬼群叶。 笑死吃挑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的街立。 我是一名探鬼主播舶衬,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赎离!你這毒婦竟也來了约炎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎圾浅,沒想到半個月后掠手,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡狸捕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年喷鸽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸拍。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡做祝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸡岗,到底是詐尸還是另有隱情混槐,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布轩性,位于F島的核電站声登,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揣苏。R本人自食惡果不足惜悯嗓,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卸察。 院中可真熱鬧脯厨,春花似錦、人聲如沸坑质。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涡扼。三九已至眯杏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壳澳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工茫经, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巷波,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓卸伞,卻偏偏與公主長得像抹镊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荤傲,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容