Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Obsłga tablic za pomocą magicznych metod klas
Forum PHP.pl > Forum > PHP
NeooeN
Witam!
Taki oto kod:
Kod
<?
class myClass {

  public function __set($name, $value) {
   echo '$name';
  }

  public function __get($name) {
        echo '$name';
  }
}

$klasa = new myClass;
$klasa->tablica[0] = 0;
echo "\n";
$zmienna = $klasa->tablica["klucz"];
?>
zwraca takie coś:
Kod
tablica
tablica
Jak widać zdeklarowałem klase z magicznymi metodami __set i __get a następnie próbuje zapisać i pobrać pewne wartości do i z tablic. Niestety funkcje te zwracają tylko informcje o nazwie tej tablicy i ani słowa o ewentualnym indeksie (tak jak by była to zwykła zmienna, skalar). Czy jest jakiś sposób aby mimo wszystko za pomocą tych metod obsłużyć tablice tak abym mógł w ramach klasy dynamicznie je tworzyć i zmieniać podobnie jak ma to miejsce przy zabawie ze zmiennymi?
Z góry dziękuje za pomoc!
mortus
No oczywiście, że jest taki sposób. Przykład:
  1. <?php
  2. class myClass {
  3. private $tablica = array();
  4.  
  5. public function __set($name, $value) {
  6. $this->tablica[$name] = $value;
  7. }
  8.  
  9. public function __get($name) {
  10. return $this->tablica[$name];
  11. }
  12.  
  13. }
  14. $klasa = new myClass();
  15. $klasa->data = '27.04.2010';
  16. echo $klasa->data;
  17. ?>
Po prostu źle się do tego zabrałeś. Mam nadzieję, że powyższy przykład jest zrozumiały.

EDIT:
Był mały błąd w linii 10. Skopiowałem zmienną $name tak, jak była czyli w cudzysłowach, które były zbędne. Teraz jest dobrze.

Ehh... Chyba źle Cię zrozumiałem. Zmęczenie. Przepraszam.
NeooeN
Rzeczywiście źle mnie zrozumiałeś. Otrzymałem już odpowiedź na innym forum. Odpowiedź na mój problem to arrayaccess. Działa minimalnie inaczej niż zakładałem ale dla mnie sprawdzi sie równie znakomicie. Dziękuje za zainteresowanie tematem!
mortus
Jednakże istnieje rozwiązanie Twojego problemu. Potrzeba, aby magiczna metoda __get zwracała referencję do naszego obiektu, jak poniżej:
  1. <?php
  2. class myClass {
  3.  
  4. public function __set($name, $value) {
  5. $this->$name = $value;
  6. }
  7.  
  8. public function &__get($name) {
  9. return $this->$name;
  10. }
  11.  
  12. }
  13. $klasa = new myClass();
  14. $klasa->dane[0] = 'dana 1';
  15. $klasa->dane[1] = 'dana 2';
  16. echo '<pre>'; print_r($klasa->dane); echo '</pre>';
Chodzi o to, że w PHP począwszy od wersji 5.2.0 metoda __get zwraca kopię obiektu, a nie jak to było we wcześniejszych wersjach referencję do tego obiektu. Dlaczego tak jest? Nie wiem. Niemniej powoduje to brak dostępu do konkretnego elementu tablicy, choć nie do samej tablicy.
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.