2011-01-17 21 views
46

Bu konuda biraz karıştı. Ben rayların üzerinde Ruby ActiveRecord çok benzer davranmaya çalışır bir ORM sınıf tasarlama, ama bunun konuyla ilgisi yok.PHP kendini değiştirmek :: statik Can ::?

Söylemeye çalıştığım şey, sınıfımın özellikle veritabanı ve tablo kullanımı için statik öznitelik mirasından kapsamlı bir şekilde yararlanmasıdır. Sorum şu ki, ben kendi kullanmalı mıyım?

+0

bence 'Statik' ilk etapta yanlış bir yaklaşımdır. Kulağa hoş geliyor (ve eğer yanlış olursa lütfen düzeltin), sadece kodunuzu yoksaydınız. – PeeHaa

cevap

94

Kendinize şunu sormalısınız: "Sorunu uygun yaklaşımla mı hedefliyoruz?"

self:: ve static:: iki farklı şey yapar. Örneğin self:: veya __CLASS__ statik ileri çağıran ihtiyacını yeterli yüzden değil, belli kapsamda tanımlanan akım sınıfına referanslar vardır.

Mirasta ne olacak?

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(); 

Bu Bu yazdırır Bu beklenen davranış

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(); 

sahiptir static:: ile diğer taraftan ise

A 

yazdırırdenir

B 
. Bu zamanında de başvuruldu sınıf çağıran sınırlandırılmasını çözer.

Bu düşünceyle, sorunu şimdi yeterince görebileceğinizi ve çözebileceğinizi düşünüyorum. Birkaç statik üye devralma ve ebeveyn ve çocuk üyelerine erişim gerekiyorsa self:: yeterli olmayacaktır.

+8

Temel olarak, her şeyin olduğu gibi, her zamanki gibi davranmasını isterim, bunun yerine statik kullanmalıyım? Ve sonra, bu tür şeyler gerçekten önemli olmadığında, uyumluluk için kendini de kullanabilirim. Bu doğru mu? – elite5472

+7

Bu doğru, eğer geriye dönük uyumluluk istiyorsanız, kendinizle başa çıkmak zorunda kalacaksınız. Statik üyelere bu şekilde erişmek isterseniz, üyeleri saran statik bir yöntem yapmanız gerekecektir. – DarkThrone

+0

tamam, benim için işleri temizlediğiniz için teşekkürler. – elite5472

6

deneyin öz arasındaki farkı statik görmek için feryat kodu kullanma:

<?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(); 
?> 

ve bu sonuç almak: PARENT_ sınıfını

kullanılarak

  • öz => ebeveyn
  • statik => ebeveyn

kullanarak Child_ sınıf

  • öz => ebeveyn
  • statik => çocuk