Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dynamiczne wlasciwosci obiektu
Yorki
post
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 2
Dołączył: 12.09.2005

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


Witam, chcialbym do pewnych danych (array) miec dostep jak przez obiekt :

  1. echo $obiekt->wlasciwosc;


Jak to zrobic?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
Yorki
post
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 2
Dołączył: 12.09.2005

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


Chodziło mi bardziej o to, aby to było w drugą stronę (IMG:style_emoticons/default/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?

Ten post edytował Yorki 22.03.2012, 09:22:57
Go to the top of the page
+Quote Post
mortus
post
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


Nazywa się to method chaining i każda metoda musi zwracać obiekt $this, czyli obiekt, który tę metodę wywołuje.
Go to the top of the page
+Quote Post
by_ikar
post
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


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.
Go to the top of the page
+Quote Post
cudny
post
Post #6





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


wystarczy coś takiego:

  1. $obj = (object) array('raz'=>'pierwszy,'dwa'=>'drugi','trzy'=>'trzeci');
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: 20.12.2025 - 16:00