2011-01-17 9 views
46

Jestem trochę zmieszany z tą sprawą. Projektuję klasę ORM, która próbuje zachowywać się bardzo podobnie do ActiveRecord w rubinach na szynach, ale to nie ma znaczenia.PHP Czy statyczne :: zastąpić self ::?

Próbuję powiedzieć, że moja klasa korzysta w szerokim zakresie z dziedziczenia atrybutów statycznych, szczególnie w przypadku obsługi bazy danych i tabel. Moje pytanie brzmi, czy w ogóle powinienem używać self?

+0

myślę "static" jest w pierwszym rzędzie błędnym podejściem. Wygląda na to (i proszę poprawić, jeśli jest źle), po prostu spowodowałeś, że twój kod jest nietrwały. – PeeHaa

Odpowiedz

94

Musisz zadać sobie pytanie: "Czy jestem ukierunkowany na problem z odpowiednim podejściem?"

self:: i static:: zrobić dwie różne rzeczy. Na przykład: self:: lub __CLASS__ są odniesieniami do bieżącej klasy, więc zdefiniowane w pewnym zakresie NIE wystarczą do statycznego wywoływania do przodu.

Co stanie się w przypadku dziedziczenia?

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     self::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 

B::test(); 

To będzie drukować

A 

W drugiej z static:: Ma oczekiwanego zachowania

class A { 
    public static function className(){ 
     echo __CLASS__; 
    } 

    public static function test(){ 
     static::className(); 
    } 
} 

class B extends A{ 
    public static function className(){ 
     echo __CLASS__; 
    } 
} 


B::test(); 

To wydrukować

B 

To się nazywa late static binding in PHP 5.3.0. Rozwiązuje to ograniczenie wywoływania klasy, która była , do której odwołuje się w czasie wykonywania.

Mając to na uwadze, myślę, że możesz teraz zobaczyć i rozwiązać problem w odpowiedni sposób. Jeśli dziedziczysz kilku statycznych członków i potrzebujesz dostępu do rodzica i członków rodziny, to nie wystarczy.

+8

Więc jeśli chcę, żeby rzeczy zachowywały się jak zwykle, jak w każdym innym języku, powinienem używać statycznego zamiast? A kiedy takie rzeczy naprawdę nie mają znaczenia, mogę równie dobrze użyć siebie do kompatybilności. Czy to jest poprawne? – elite5472

+7

Zgadza się, jeśli chcesz kompatybilności wstecznej będziesz musiał sobie radzić. Jeśli chcesz uzyskać dostęp do statycznych członków w ten sposób, musisz wykonać statyczną metodę, która otoczy członków. – DarkThrone

+0

W porządku, dzięki za oczyszczenie dla mnie. – elite5472

6

spróbuj użyć kodu poniżej, aby zobaczyć różnicę między siebie i statyczny:

<?php 
class Parent_{ 
    protected static $x = "parent"; 
    public static function makeTest(){ 
     echo "self => ".self::$x."<br>"; 
     echo "static => ".static::$x;  
    } 
} 

class Child_ extends Parent_{ 
    protected static $x = "child"; 
} 

echo "<h4>using the Parent_ class</h4>"; 
Parent_::makeTest(); 

echo "<br><h4>using the Child_ class</h4>"; 
Child_::makeTest(); 
?> 

i masz ten wynik:

użyciu klasy PARENT_

  • jaźń => rodzic
  • statyczne => rodzic

użyciu klasa Child_

  • własnym => rodzic
  • statyczne => Dziecko