Witam,
tworzę obecnie modularną aplikację w PHP opartą o OOP. Każda klasa w swoim konstruktorze przyjmuje obiekt $data, który jest tworzony po stronie przeglądarki i wysyłany na serwer. Problem jest taki, że nigdy nie ma pewności co $data zawiera.
Załóżmy, że pisząć moduł , chcę sprawdzić zawartość $data -> pole1 -> pole2, w takim razie muszę to napisać:

Kod
if (isset($data -> pole1) && isset($data -> pole1 -> pole2) && $data -> pole1 -> pole2 == COŚ) {
...
}


Biorąc pod uwagę jak bardzo skomplikowana jest struktura $data, jest to niewygodne i nieprzejrzyste.
Rozwiązałem problem częściowo za pomocą enkapsulacji każdej wartswy danych w klasę Capsule, która przy odwołaniu $obj -> pole automatycznie zwróci wartość pola i zwróci potrzebną wartość.

Kod
  class Capsule {
    private $capsuled_frame_data = false;
    
    public function __construct($obj = false) {
      if ($obj !== false) {
        foreach ($obj as &$val) {
          if (is_object($val)) {
            $val = new \Capsule($val);
          }
        }
        $this -> capsuled_frame_data = $obj;
      }
    }
    
    public function __get($name) {
      return (isset($this -> capsuled_frame_data -> $name)) ? $this -> capsuled_frame_data -> $name : new \Capsule();
    }
    
    public function IsEmpty() {
      return ($this -> capsuled_frame_data !== false) ? false : true;
    }
  }


W powyższym przykładzie istnienie danego pola zwraca jego wartość, brak new Cepsule(), lecz nie jest to do końca tak jakbym chciał. Chciałbym, by końcowa wartość wynosiła false, tj

$data -> pole1 -> pole2 === false

Niestety jeżeli zmienię wartość zwracaną " new \Capsule();" na "false", to skrypt wywali się w momencie $data -> pole1, gdyż false nie ma metody pole2.
Jak to zrobić tak by $data -> pole1 zwracało new Capsule() a $data -> pole1 -> pole2 już false? Ilość zagnieżdżeń jest dowolna i nazewnictwo tez. Może to być również
$data -> cos_innego -> jakies_pole -> chain -> koncowe_pole;