2015-05-30 80 views
2

遍佈我有幾個元素的數組的地方,例如對象:一種可以用作陣列以及

$myItem = [ 'a' => 10, 'b' => 20 ] 

但是但我想與類來代替它

$ myClass = new MyOwnClass(10,20);

$a = $myClass->GetSomeValue(); // this is the old 'a' 
$b = $myClass->GetSomeOtherValue(); // this is the old 'b' 

,但實際的原因我還是希望能夠調用

$a = $myClass['a']; 
$b = $myClass['b']; 

是類似的東西可能在PHP?

+3

實現[了ArrayAccess](http://php.net/manual/en/class.arrayaccess.php)接口 – Federkun

+0

對於使用[..]操作者訪問, ArrayAccess就足夠了。如果你希望你的對象的行爲更像一個數組,所以你也可以迭代它,等等,你可以擴展[ArrayObject](http://php.net/manual/en/class.arrayobject.php) –

回答

2

因此,有一個名爲ArrayAccess的接口。你必須把它實現給你的班級。

class MyOwnClass implements ArrayAccess { 
    private $arr = null; 

    public function __construct($arr = null) { 
     if(is_array($arr)) 
      $this->arr = $arr; 
     else 
      $this->arr = []; 
    }  

    public function offsetExists ($offset) { 
     if($this->arr !== null && isset($this->arr[$offset])) 
      return true; 
     return false; 
    } 

    public function offsetGet ($offset) { 
     if($this->arr !== null && isset($this->arr[$offset])) 
      return $this->arr[$offset]; 
     return false; 
    } 

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

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

使用:

$arr = ["a" => 20, "b" => 30]; 
$obj = new MyOwnClass($arr); 

$obj->offsetGet("a"); // Gives 20 
$obj->offsetSet("b", 10); 
$obj->offsetGet("b"); // Gives 10