[英]PHP array_key_exists() and SPL ArrayAccess interface: not compatible?
[英]PHP, SPL, ArrayAccess Interface
我試圖了解ArrayAccess接口背后的想法,
我不明白每種方法的含義,如果那些方法(函數)是“內置”函數,而ArrayAccess接口(也就是“內置”)只是“確保”我要實現那些“內置”方法(函數) )
我試圖了解我們的代碼“幕后”的各個功能在做什么。
function offsetSet($offset, $value);
function offsetGet($offset);
function offsetUnset($offset);
function offsetExists($offset);
如果我了解ArrayAccess是一個內置接口,其中包含要實現的密封,則在我們實現它們時,我們僅實現對內置函數的引用,如果有人可以幫助我實現這一目標,我將非常高興。
如果實現該接口,則該對象的行為就像一個數組。 例如,如果$foo
是實現ArrayAccess
的類的實例:
$foo['bar'] = 42
調用offsetSet('bar', 42)
。
echo $foo['bar']
調用offsetGet('bar')
。
unset($foo['bar'])
調用offsetUnset('bar')
。
isset($foo['bar'])
調用offsetExists('bar')
。
您永遠不會自己明確地調用函數offset *。 當您將對象作為數組訪問時,它隱式發生。
在將ArrayAccess
與SimpleXMLElement
(內部類未實現)進行比較時,我也很好奇。 該接口已經在手冊中進行了充分的文檔說明,因此我想重點介紹一些與偏移類型有關的差異。
但首先,實現ArrayAccess
的類的樣板示例實現在訪問時給出輸出:
/**
* ArrayAccess Example
*/
class ExampleArrayLikeAccess implements 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.
*/
public function offsetExists($offset) {
echo " - offsetExists(", $this->varString($offset),")\n";
}
/**
* 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.
*/
public function offsetGet($offset) {
echo " - offsetGet(", $this->varString($offset),")\n";
}
/**
* 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
*/
public function offsetSet($offset, $value) {
echo " - offsetSet(", $this->varString($offset), ", ", $this->varString($value), ")\n";
}
/**
* Offset to unset
* @link http://php.net/manual/en/arrayaccess.offsetunset.php
* @param mixed $offset The offset to unset.
* @return void
*/
public function offsetUnset($offset) {
echo " - offsetUnset(", $this->varString($offset),")\n";
}
/**
* helper to give a variable dump in form of a string
*/
private function varString($var) {
ob_start();
var_dump($var);
return trim(strtr(ob_get_clean(), ["\n" => '', "\r" => '']), ' {}');
}
}
運行一些用法示例。 我以評論形式留下了筆記。 這應該是不言自明的:
$like = new ExampleArrayLikeAccess();
/* offsetExists */
// indexes/keys that behave similar to PHP arrays:
isset($like[1]); # integer stay integer
# offsetExists(int(1))
isset($like['1']); # string like an integer - converted to integer
# offsetExists(int(1))
isset($like['01']); # string unlike an integer - stays string
# offsetExists(string(2) "01")
isset($like[TRUE]); # booleans are converted to integer
# offsetExists(bool(true))
// indexes/keys that differ to PHP arrays:
isset($like[1.1]); # a float stays a float (double)
# offsetExists(double(1.1))
isset($like[NULL]); # NULL stays NULL
# offsetExists(NULL)
isset($like[array()]); # array stays array
# offsetExists(array(0))
isset($like[$like]); # object stays object
# offsetExists(class SxeLikeAccess#2 (0))
/* offsetGet */
// indexes/keys behave the same as with offsetExists:
$like[1]; # offsetGet(int(1))
$like['1']; # offsetGet(int(1))
$like['01']; # offsetGet(string(2) "01")
// ...
/* offsetSet */
$like[1] = 'value'; # index/key behaves the same as with offsetExists
# offsetSet(int(1), string(5) "value")
$like[] = 'value'; # index/key is NULL
# offsetSet(NULL, string(5) "value")
$like[NULL] = 'value'; # index/key is NULL
# offsetSet(NULL, string(5) "value")
/* offsetUnset */
unset($like[1]); # index/key behaves the same as with offsetExists
unset($like[NULL]); # same for NULL
與標准PHP數組的主要區別在於,您不僅可以使用整數和字符串作為偏移量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.