2012-07-04 80 views
1

我试图了解背后ArrayAccess接口界面的想法,PHP,SPL,ArrayAccess接口接口

我不明白每一种方法是一下,如果这些方法(函数)是“内置”的功能和ArrayAccess接口接口(也“内置”)只是“确保”我要实现那些“内置”方法(功能)

我想了解每个thoes函数是在用我们的代码“幕后” 。

function offsetSet($offset, $value); 
function offsetGet($offset); 
function offsetUnset($offset); 
function offsetExists($offset); 

如果我明白了ArrayAccess是一个内置的接口,包含密封件实现,当我们执行他们,我们只实现内置函数thoes引用,我会很高兴,如果有人可以帮助我得到这个权利。

+1

这个课程在这里有很好的文档http://php.net/manual/en/class.arrayaccess.php – Ziumin

回答

6

如果您实现了该接口,那么该对象就像一个数组。例如,如果$foo是实现的类的实例ArrayAccess

$foo['bar'] = 42 调用offsetSet('bar', 42)

echo $foo['bar']调用offsetGet('bar')

unset($foo['bar'])来电offsetUnset('bar')

isset($foo['bar'])来电offsetExists('bar')

你从不显式调用函数offset *自己。当你以数组的形式访问对象时,它会隐式发生。

+0

非常感谢你Matthew,如果你确认我对这个主题的理解,我会非常高兴的。是一个“内置接口”这个接口,包含这些函数的签名,这些函数引用了一个“内置”函数,当我们以数组的形式访问对象时会自动响应,并且非常感谢您的回答。手册并不明白这个界面,如果你可以请确认,祝你有个美好的一天马修。 –

+0

该接口内置了这四个函数签名,但PHP程序员必须实际执行它们。在像访问数组时一样自动调用偏移量*函数的行为也是内置的...您无法使用自己的接口进行操作。 (有几个内置接口在实现时类似地影响核心PHP功能。) – Matthew

+0

谢谢马修,如果我得到这个权利是唯一的函数和参数签名,并自动调用偏移*的行为,但请告诉我,这种行为是它只是说当你访问数组调用偏移*,什么我说的是这种行为只是指函数名称?什么意思是我的责任是将功能设置为我想要的功能,并再次感谢。 –

0

虽然比较ArrayAccessSimpleXMLElement(内部类没有实现它),我也很好奇。该界面已经在手册中有详细记录,所以我想强调一些与偏移类型有关的特定差异。

但首先一个样板示例实现执行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数组的主要区别在于,您不仅可以使用整数和字符串作为偏移量。