Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak odwołać się do właściwości statycznej klasy dziedziczącej?
Martio
post
Post #1





Grupa: Zablokowani
Postów: 167
Pomógł: 2
Dołączył: 15.02.2004

Ostrzeżenie: (30%)
XX---


  1. <?php
  2. abstract class A {
  3. protected static $test = 'a';
  4.  
  5. public function __construct() {
  6. echo self::$test;
  7. }
  8. }
  9. class B extends A {
  10. protected static $test = 'b';
  11. }
  12.  
  13. $b = new B(); // result: a
  14. ?>


Dlaczego dziedzicząc po klasie A konstruktor wyświetla mi wartość właściwości statycznej klasy A, a nie klasy B, jak chciałbym?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Cysiaczek
post
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Dzieje się tak dlatego, że konstruktor klasy A używa słowa kluczowego self, które wskazuje na właściwość tej klasy, a nie obiektu. Dla konstruktora klasy A nie nastąpiło przesłonięcie $test. Nie odczytasz w ten sposób nic z klasy potomnej, chyba, że w kontekście obiektu.

Pozdrawiam

Ten post edytował Cysiaczek 20.01.2007, 13:04:28
Go to the top of the page
+Quote Post
Martio
post
Post #3





Grupa: Zablokowani
Postów: 167
Pomógł: 2
Dołączył: 15.02.2004

Ostrzeżenie: (30%)
XX---


W sumie gdyby zamiast statycznej użyć właściwości chronionej, to odwołujesz się słowem $this, a więc wskazujesz również na klasę bazową, a mimo to po dziedziczeniu zwracasz wartość klasy dziedziczącej, a nie bazowej.

  1. <?php
  2. abstract class A1 {
  3. protected static $property = 'a';
  4.  
  5. public function __construct() {
  6. echo self::$property;
  7. }
  8. }
  9. class B1 extends A1 {
  10. protected static $property = 'b';
  11. }
  12.  
  13. $test1 = new B1(); // a
  14.  
  15. abstract class A2 {
  16. protected $property = 'a';
  17.  
  18. public function __construct() {
  19. echo $this->property;
  20. }
  21. }
  22. class B2 extends A2 {
  23. protected $property = 'b';
  24. }
  25.  
  26. $test2 = new B2(); // b
  27. ?>


Zerknij na kod. Moim zdaniem dziedziczenie statycznych właściwości błędnie się zachowuje.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #4





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Nie. słówko self w połączeniu ze static oznacza kontekst aktualnej klasy, nie obiektu. Twój drugi przykład odnosi się do kontekstu obiektu klasy (odcisku klasy) i dlatego zachowuje się inaczej. Dzieje się tak dlatego, że właściwość zostaje przesłonięta.

Pozdrawiam.
Go to the top of the page
+Quote Post
Martio
post
Post #5





Grupa: Zablokowani
Postów: 167
Pomógł: 2
Dołączył: 15.02.2004

Ostrzeżenie: (30%)
XX---


A więc nie mogę się odwołać do jakiejkolwiek właściwości klasy dziedziczącej w metodzie statycznej klasy bazowej?
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Owszem, możesz, ale tylko w kontekście obiektu. Przyjmij jako regułę to, że pisze się tak, żeby nie korzystać z właściwości statycznych : ) Korzystanie z tego jest niebezpieczne. Patrz:

  1. <?php
  2. abstract class A {
  3. protected static $property = 1;
  4.  
  5. public function __construct() {
  6. echo self::$property.'<br />';
  7. }
  8. }
  9.  
  10. class B extends A {
  11.  
  12. public function __construct(){
  13. parent::__construct();
  14.  
  15. if (is_integer(parent::$property)){
  16. print "wszystko ok w B<br />";
  17. parent::$property='zmiana';
  18. }
  19. }
  20.  
  21. }
  22.  
  23. class C extends A {
  24.  
  25. public function __construct(){
  26. parent::__construct();
  27.  
  28. if (is_integer(parent::$property)){
  29. print "wszystko ok w C<br />";
  30. }
  31. }
  32.  
  33. }
  34.  
  35. new B();
  36. new C();
  37. ?>


Zmieniłeś typ w jednym obiekcie, a drugi już nie działa. Nie powinno się stosować składowych statycznych, a przynajmniej bardzo uważać.

Pozdrawiam.

Ten post edytował Cysiaczek 20.01.2007, 15:41:59
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: 16.09.2025 - 16:33