Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Enkapsulacja obiektu z danymi
Skie
post
Post #1





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


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;
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 11:29