ArrayAccess mehrdimensional - Problem mit offsetSet

ZodiacXP

Erfahrenes Mitglied
Hiho.

Eine Klasse implementiert ArrayAccess (nicht ArrayObject), so dass man darauf wie auf ein Array zugreifen kann.
Leider unterstützt es nicht mehrdimensionale Arrays also wollte ich es so lösen (Beispiel):
PHP:
class Haus implements ArrayAccess
{
  function offsetSet($offset, $value)
  {
    return new Etage($offset);
  }
}

class Etage implements ArrayAccess
{
  function offsetSet($offset, $value)
  {
    $this->zimmer[$offset] = $value;
  }
}

$haus = new Haus();
$haus[1][123] = 'Goerge';

Leider wird mir immer wieder von XDebug gemeldet das hätte keinen Effekt:
Code:
Indirect modification of overloaded element of Haus has no effect in ...

Gibt es keinen Weg ein Objekt auch als mehrdimensionales Array zu behandeln?
 
Soweit ich mich erinnern kann, kann man ArrayObject auch ganz normal wie ein array behandeln. Vielleicht solltest du deine Objekte einfach ArrayObject extenden lassen? Wenn nein, welchen spezifischen Grund gibts, das nicht zu tun?

Zu der Meldung, die sollte auch klar sein, denn die Klasse Etage hat zumindest in deinem Beispiel keine Property "zimmer". Wenn du die Property anlegst, sollte die Meldung IMHO weg sein:

PHP:
class Etage implements ArrayAccess
{
  private $zimmer = new ArrayObject();

  function offsetSet($offset, $value)
  {
    $this->zimmer[$offset] = $value;
  }
}
 
Vielen Dank!

Soweit ich mich erinnern kann, kann man ArrayObject auch ganz normal wie ein array behandeln. Vielleicht solltest du deine Objekte einfach ArrayObject extenden lassen? Wenn nein, welchen spezifischen Grund gibts, das nicht zu tun?

Ok, ich habe bemerkt, dass es an offsetGet() lag.

Zu der Meldung, die sollte auch klar sein, denn die Klasse Etage hat zumindest in deinem Beispiel keine Property "zimmer".

War ein Minimalbeispiel, wo einiges fehlte ;)

Aber nun sehe ich offsetGet und dies kann nicht erkennen ob ein mehrdimensionales Array gefordert wird oder ein eindimensionales, was mir wichtig war. Das Objekt läuft nun wie ein gewohntes Array aber leider fehlt diese Unterscheidung.
 
Zurück