Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zmienne statyczne w klasach dziedziczących
Forum PHP.pl > Forum > PHP > Object-oriented programming
wirus15
  1. <?php
  2.  
  3. abstract class klasa1 {
  4. public function poka() {
  5.       echo $this -> zmienna; // nie dziala
  6.       echo self::$zmienna; // nie dziala;
  7.       eval('echo '.get_class($this).'::$zmienna;'); // niezbyt fajne tongue.gif
  8.  
  9.  }
  10. }
  11.  
  12. class klasa2 extends klasa1 {
  13. protected static $zmienna = 'elo2';
  14. }
  15.  
  16. class klasa3 extends klasa1 {
  17.   protected static $zmienna = 'elo3';
  18. }
  19.  
  20. $klasa = new klasa2;
  21. $klasa -> poka();
  22. ?>



A wiec tak:
klasa2 i klasa3 dziedziczą po klasie1. Obie zawierają pewne zmienne statyczne, klasa1 zaś zawiera metody operujące na tych zmiennych. Tyle ze to nie dziala sad.gif
Jeszcze jedna rzecz jaka przychodzi mi do glowy to trzymanie tych zmiennych w klasie glownej w statycznej tablicy, gdzie kluczami beda nazwy klas. Chociaz to tez nie jest fajne rozwiazanie.
Quider
Jeżeli klasa2 dziedziczy po klasa1 a klasa1 odwołuje się do tej zmiennej, to oczywiste, że nie będzie działać bo klasa1 nie ma pojęcia o istnieniu zmiennej statycznej klasy2. Cały problem polega na hermetyzacji klas.
Spróbuj użyć implementacji klas:
  1. <?php
  2. klasa1 implemets klasa_abstrakcyjna1, klasa_abstrakcyjna2, ..., klasa_abstrakcyjna[n]
  3. {
  4. //pola i metody
  5. }
  6. ?>

wtedy powinno działać
Noddi
Cytat(Quider @ 10.03.2009, 00:44:23 ) *
Jeżeli klasa2 dziedziczy po klasa1 a klasa1 odwołuje się do tej zmiennej, to oczywiste, że nie będzie działać bo klasa1 nie ma pojęcia o istnieniu zmiennej statycznej klasy2. Cały problem polega na hermetyzacji klas.
Spróbuj użyć implementacji klas:
  1. <?php
  2. klasa1 implemets klasa_abstrakcyjna1, klasa_abstrakcyjna2, ..., klasa_abstrakcyjna[n]
  3. {
  4. //pola i metody
  5. }
  6. ?>

wtedy powinno działać


Mylisz tutaj dwa pojęcia: klasy abstrakcyjnej i interfejsu. Implementować można interfejs a nie klasę abstrakcyjną.

@wirus15: Nie wiem po co w takim przypadku wykorzystujesz dziedziczenie, nadużywasz go. Dziedziczenie ma służyć stworzeniu hierarchi klas: od ogółu do szczegółu.
Mephistofeles
Spróbuj użyć selfa, ale wcześniej deklarując zmienną w klasie bazowej.
wirus15
Cytat(Noddi @ 16.03.2009, 22:52:52 ) *
@wirus15: Nie wiem po co w takim przypadku wykorzystujesz dziedziczenie, nadużywasz go. Dziedziczenie ma służyć stworzeniu hierarchi klas: od ogółu do szczegółu.


Nie nie, klasy dziedziczące są rzeczywiście podklasą klasy głownej rozszerzoną o kilka specyficznych cech (m. in. zmienne statyczne). Chodzi mi o to, czy jest jakiś sposób operowania z poziomu klasy głownej na tych zmiennych
bez definiowania takich samych funkcji w kazdej klasie dziedziczącej. Wyczytałem, że rzecz której potrzebuje będzie dopiero w php 5.3
  1. <?php
  2. class klasa {
  3.      public static $zmienna = 10;
  4. }
  5. $klasa = "klasa";
  6. $zmienna = "zmienna";
  7. echo $klasa::$zmienna; // dokladnie to :)
  8. ?>
Noddi
Bez PHP 5.3 się chyba nie obejdzie. Gdyby to nie były zmienne statyczne nie byłoby problemu, a tak to niestety w obecnej wersji PHP jest to niemożliwe. Jeśli już PHP 5.3 to wykorzystałbym: Late Static Binding.
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.