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ù)講