2014-02-17 74 views
3

我有兩個類即foo的&酒吧PHP實現了ArrayAccess

class bar extends foo 
{ 

    public $element = null; 

    public function __construct() 
    { 
    } 
} 

和Foo類竟把

class foo implements ArrayAccess 
{ 

    private $data = []; 
    private $elementId = null; 

    public function __call($functionName, $arguments) 
    { 
     if ($this->elementId !== null) { 
      echo "Function $functionName called with arguments " . print_r($arguments, true); 
     } 
     return true; 
    } 

    public function __construct($id = null) 
    { 
     $this->elementId = $id; 
    } 

    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) 
    { 
     if ($this->offsetExists($offset)) { 
      unset($this->data[$offset]); 
     } 
    } 

    public function offsetGet($offset) 
    { 
     if (!$this->offsetExists($offset)) { 
      $this->$offset = new foo($offset); 
     } 
    } 
} 

我想,當我運行下面的代碼:

$a = new bar(); 
$a['saysomething']->sayHello('Hello Said!'); 

應該返回函數sayHello用參數調用Hello!來自foo的__call魔術方法的

在這裏,我想說的是saysomething$這個 - > elementId傳遞從Foo的__construct功能和的sayHello應被視爲方法你好說應採取作爲參數 for sayHello函數將從__call魔法方法呈現。

此外,需要產業鏈的方法,如:

$a['saysomething']->sayHello('Hello Said!')->sayBye('Good Bye!'); 

回答

2

如果我沒有記錯的話,你應該改變foo::offsetGet()這樣:

public function offsetGet($offset) 
{ 
    if (!$this->offsetExists($offset)) { 
     return new self($this->elementId); 
    } else { 
     return $this->data[$offset]; 
    } 
} 

它返回自己的實例,如果沒有元素在給定的偏移量。

也就是說,foo::__construct()應該bar::__construct()以及被稱爲傳遞其它的值大於null

class bar extends foo 
{ 

    public $element = null; 

    public function __construct() 
    { 
     parent::__construct(42); 
    } 
} 

更新

要鏈接的呼叫,您需要返回實例from __call()

public function __call($functionName, $arguments) 
{ 
    if ($this->elementId !== null) { 
     echo "Function $functionName called with arguments " . print_r($arguments, true); 
    } 
    return $this; 
} 
+0

非常有效!謝謝你@Jack! – Guns

+1

@槍不用客氣;請注意'$ bar ['saidomething']'不會返回'bar'對象,而是'foo'對象。 –

+0

謝謝!這工作得很好,但是,當我鏈方法不起作用。我正在嘗試'$ a ['saysomething'] - > sayHello ['Hello Said!] - > sayBye('Good Bye!');'。我如何實現這一目標? – Guns