Dennis: GeisterArray, da und doch nicht da

Beitrag lesen

Hi Sven,

Ich gebe nur mal so zu bedenken: Wenn XML im Spiel ist, dann könnte es durchaus sein, dass dein XML-Parser kein wahres PHP-Array produziert, sondern irgendeine nette Objekt-Sonderform mit Gettern und Settern, die ein Array nur simulieren. Solch eine Konstruktion deckt man mit var_dump eventuell nicht auf.

Darüber hab ich gestern auch schon nachgedacht, bin allerdings zu dem Schluss gekommen, dass du es nicht schaffst, den Namen der Klasse bzw. die Tatsache, dass $w ein Objekt ist vor var_dump() und print_r() zu verstecken.

Ich habs grade mal ausprobiert, einmal mit einer selbst geschriebenen Klasse (Quick'n Dirty) und einmal mit der PHP-Klasse ArrayObject():

<?php  
  
class MyArr implements ArrayAccess {  
  private $_data;  
  public function __construct() {  
    $this->_data = array();  
  }  
  public function offsetGet($k) {  
    return $this->_data[$k];  
  }  
  public function offsetSet($k, $v) {  
    $this->_data[$k] = $v;  
  }  
  public function offsetExists($k) {  
    return isset($this->_data[$k]);  
  }  
  public function offsetUnset($k) {  
    unset($this->_data[$k]);  
  }  
  public function __get($k) {  
    return $this->_data[$k];  
  }  
  public function __set($k, $v) {  
    $this->_data[$k] = $v;  
  }  
  public function __isset($k) {  
    return isset($this->_data[$k]);  
  }  
  public function __unset($k) {  
    unset($this->_data[$k]);  
  }  
}  
  
$w = new MyArr();  
$w['test'] = 'ABC';  
print_r($w);  
var_dump($w);  
  
$w = new ArrayObject();  
$w['test'] = 'DEF';  
print_r($w);  
var_dump($w);

Sowohl print_r() als auch var_dump() geben in beiden Fällen korrekt die Identität des Objekts wieder, also object(MyArr) bzw. object(ArrayObject).
Wobei man bei der MyArr-Klasse die __*-Methoden auch genauso gut weglassen kann, denn die werden nie genutzt, wenn man auf das Objekt wie auf ein Array zugreift.

Viele Grüße,
  ~ Dennis.