2012-02-07 80 views
3

我在哪裏可以找到ArrayObject的完整源代碼(在PHP中)?PHP ArrayObject內部工作

我不明白什麼是爲什麼,你可以使用「箭頭」時的元素添加到您的ArrayObject的,例如:

$a = new ArrayObject(); 
$a['arr'] = 'array data';        
$a->prop = 'prop data'; //here it is 

你可以看到$a->prop = 'prop data';使用。

有什麼神奇的方法或什麼用,和PHP是如何知道的例子$a['prop']$a->prop意味着一樣的嗎? (在這方面)

+1

你總是可以這樣做:'公共職能__set($ key,$ val){$ this-> arr [$ key] = $ val;}'和getter一樣。) – Vyktor 2012-02-07 22:31:14

+0

它實際上是[用C寫的](http://svn.php.net /viewvc/php/php-src/trunk/ext/spl/spl_array.c?view=markup),但是,你可以用純PHP做同一個。 – Wrikken 2012-02-07 22:47:30

+0

*(source)* http://lxr.php.net/opengrok/xref/PHP_TRUNK/ext/spl/spl_array.c – Gordon 2012-02-07 22:49:29

回答

2

是的,它是魔術,它可以直接在PHP中完成。就拿看重載http://www.php.net/manual/en/language.oop5.overloading.php

您可以使用__get()__set在一個類來做到這一點。爲了使對象的行爲像數組,你必須實現http://www.php.net/manual/en/class.arrayaccess.php

這是我的示例代碼:

<?php 
class MyArrayObject implements Iterator, ArrayAccess, Countable 
{ 
    /** Location for overloaded data. */ 
    private $_data = array(); 

    public function __set($name, $value) 
    { 
     $this->_data[$name] = $value; 
    } 

    public function __get($name) 
    { 
     if (array_key_exists($name, $this->_data)) { 
      return $this->_data[$name]; 
     } 

     $trace = debug_backtrace(); 
     trigger_error(
      'Undefined property via __get(): ' . $name . 
      ' in ' . $trace[0]['file'] . 
      ' on line ' . $trace[0]['line'], 
      E_USER_NOTICE); 
     return null; 
    } 

    /** As of PHP 5.1.0 */ 
    public function __isset($name) 
    { 
     return isset($this->_data[$name]); 
    } 

    /** As of PHP 5.1.0 */ 
    public function __unset($name) 
    { 
     unset($this->_data[$name]); 
    } 

    public function offsetSet($offset, $value) { 
     if (is_null($offset)) { 
      $this->_data[] = $value; 
     } else { 
      $this->_data[$offset] = $value; 
     } 
    } 

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

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

    public function offsetGet($offset) { 
     return isset($this->_data[$offset]) ? $this->_data[$offset] : null; 
    } 
    public function count(){ 
     return count($this->_data); 
    } 
    public function current(){ 
     return current($this->_data); 
    } 
    public function next(){ 
     return next($this->_data); 
    } 
    public function key(){ 
     return key($this->_data); 
    } 
    public function valid(){ 
     return key($this->_data) !== null; 
    } 
    public function rewind(){ 
     reset($this->_data); 
    } 
} 

代替current($a)next($a)使用$a->current()$a->next()

+0

你現在寫下這個例子(不到1分鐘)?:D你知道我在哪裏可以找到確切的實施? – Filkor 2012-02-07 22:39:35

+0

其實我從PHP文檔中偷了它並編輯了一些部分。 – iblue 2012-02-07 22:40:52

+1

確切的實現不是用PHP編寫的,而是用C語言編寫的,可以在PHP源代碼中找到。從http://php.net/downloads.php下載它並查看'ext/spl/spl_array.c' – iblue 2012-02-07 22:45:07