Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kilku poziomowy __get
Forum PHP.pl > Forum > PHP > Object-oriented programming
Moli
Mam w klasie tablicę o takiej wartośc
Kod
Array (
'imie' => Array ( 'pierwsze' => 'Michal' , 'drugie' => 'Jan' ) ,
'nazwisko => Array ( 'rodowe' => 'Kowalski' ) ,
)

i teraz chce w do jej elementów odwoływac się poprzez
Kod
$this->imie->pierwsze (zwroci Michał)


Jak dobrze to rozwiązać ?
kicaj
  1. <?php
  2. $aNames = ... // twoja tablica
  3.  
  4. //...
  5.  
  6. public function __get( $sName )
  7. {
  8. return $aNames[$sName];
  9. }
  10. ?>

Dodaj warunki jeszcze...
dr_bonzo
Moli: do tablicy odwolujesz sie
$tablica['indeks'];
a nie
$tablica->indeks;

tak ze musisz ten problem rozwiazac (wpakowac tablice w klase itp)
mike
No bez przesady. Powiedz mi jak można nie wpaść na tępe wstukanie w Google: array to object php
Cztery krótkie słowa bez inwencji twórczej a masz dzięki temu stertę gotowców.

http://www.phpfreaks.com/quickcode/Array-to-Object/541.php
Moli
@Mike - Widziałem tą stronę i tą funkcję. Z takim rozwiązaniem bym sobie poradził, ale nie mogę sobie poradzić z tym żeby to było w __get i wartośći z tablicy były pobierane dopiero przy daniu w kodzie $this->imie->pierwsze.
Whisller
@Moli
Nie ma możliwości odwołania się w taki sposób, przynajmniej mi osobiscie nic na ten temat nie wiadomo.
Ponieważ odwołanie typu $myClassObject->first->second jest traktowane jako odwołanie do zmiennej second obiektu first.
Więc zapis
  1. <?php
  2. class MyClass
  3. {
  4. public function __get($name)
  5. {
  6.  echo 'Name: '.$name;
  7.  }
  8. }
  9.  
  10. $oClass = new MyClass();
  11. $oClass->first->second;
  12. ?>


Zwróci nam
//--
Name: first
Notice: Trying to get property of non-object in PATH on line 13
//--
arecki
Może o coś takiego Ci chodziło ?

  1. <?php
  2.  
  3. class multiget {
  4.  
  5. private $data = array();
  6.  
  7. public function __construct(Array $array) {
  8. $this->data = $array;
  9. }
  10.  
  11. public function __get($name) {
  12. if(key_exists($name, $this->data)) {
  13. if(is_array($this->data[$name])) {
  14. return new self($this->data[$name]);
  15. } else {
  16. echo $this->data[$name];
  17. }
  18. } else {
  19. return 'invalid request';
  20. }
  21. }
  22.  
  23. public function __toString() {
  24. return 'invalid request';
  25. }
  26.  
  27. }
  28.  
  29.  
  30.  
  31. /**
  32.  * test klasy
  33.  */
  34.  
  35. $test = new multiget(Array(
  36. 'imie' => Array ( 
  37. 'pierwsze' => 'Michal' , 
  38. 'drugie' => 'Jan'),
  39. 'nazwisko' => Array (
  40. 'rodowe' => 'Kowalski'),
  41. 'wiek' => '36'
  42. ));
  43.  
  44. echo $test->imie->drugie;
  45.  
  46. ?>
SHiP
Moja stara klasa:

http://forum.php.pl/index.php?showtopic=75108
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.