Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dynamiczne wlasciwosci obiektu
Forum PHP.pl > Forum > PHP
Yorki
Witam, chcialbym do pewnych danych (array) miec dostep jak przez obiekt :

  1. echo $obiekt->wlasciwosc;


Jak to zrobic?
mortus
Trzeba przeciążyć magiczne metody __get() i __set(), tablica z danymi musi być prywatna (private) lub chroniona (protected).
  1. class A {
  2. private $_data = array();
  3. public function __set($key, $value) {
  4. $this->_data[$key] = $value;
  5. }
  6. public function __get($key) {
  7. if(array_key_exists($key, $this->_data) {
  8. return $this->_data[$key];
  9. }
  10. return null;
  11. }
  12. }

To w takim uproszczeniu, bo można nieco lepiej kontrolować zapis i odczyt zmiennych z tablicy $_data.
Yorki
Chodziło mi bardziej o to, aby to było w drugą stronę smile.gif Takie coś znalazłem:

  1. $person = array (
  2. 'firstname' => 'Maniek',
  3. 'lastname' => 'Nowak'
  4. );
  5.  
  6. $p = (object) $person;
  7. echo $p->firstname;


A mam jeszcze pytanie z innej beczki. Nie wiem jak to się profesjonalnie nazywa, ale chciałbym zrobic pewna klase, aby moc wykonywac metody w ten sposob:

  1. Klasa::metoda1()->metoda2()->metoda3()->metoda4();
  2. //Zamiast tak:
  3. Klasa::metoda1();
  4. Klasa::metoda2();
  5. Klasa::metoda3();
  6. Klasa::metoda4();


Czy da się to zrobic w ten sposob czy trzeba tworzyc obiekt i w kazdej metodzie zwracac $this?
mortus
Nazywa się to method chaining i każda metoda musi zwracać obiekt $this, czyli obiekt, który tę metodę wywołuje.
by_ikar
ArrayObject:

  1. <?php
  2.  
  3. $obj = new ArrayObject(array('jeden' => 1, 'dwa' => 2, 'trzy' => 3), ArrayObject::ARRAY_AS_PROPS);
  4.  
  5. var_dump($obj->jeden, $obj->dwa, $obj->trzy);


W przypadku tablic wielowymiarowych, musiałbyś zrobić swoją klasę, która powiedzmy by dziedziczyła ArrayObject i każda zwracana wartość byłaby obiektem ArrayObject, lub dziedziczy ArrayObject.
cudny
wystarczy coś takiego:

  1. $obj = (object) array('raz'=>'pierwszy,'dwa'=>'drugi','trzy'=>'trzeci');
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.