2013-03-12 8 views
7

Son zamanlarda PHP oyunuma adım atıyorum. JavaScript'ten geldiğimde, nesne modelini anlamak için biraz daha basit buldum.PHP property access and dollar sign

Belgelerin içinde bulamayacağımı açıklığa kavuşturmak istediğim birkaç tuhaflıkla karşılaştım. PHP sınıfları tanımlarken

, bunu gibi özellikleri tanımlayabilirsiniz:

class myClass { 

    public $myProp = "myProp"; 
    static $anotherProp = "anotherProp"; 

} 

biz kullanılmadan $myClass->myProp ($myClass adlı bir değişkene başvurulmaktadır myClass varsayarak) kullanarak erişebilirsiniz $myProp kamu değişkeni dolar işareti

Sadece statik değişkenlere :: kullanarak erişebiliriz. Yani, bir dolar işareti ile $myClass::$anotherProp gibi statik değişken erişebilirsiniz.

Soru, neden :: ve -> ile dolar işareti kullanmak zorundayız?

class SethensClass { 

    static public $SethensProp = "This is my prop!"; 

} 

$myClass = new SethensClass; 
echo $myClass::$SethensProp; 
+1

İlginç ... Bir çekim ve bir kapanış talebi. – Sethen

+0

Burada [başka sorunuz] (http://stackoverflow.com/q/17681253/20578) hakkında (burada kişisel bir dizi soru olarak sorulursa, kişisel olarak iyi olacağını düşündüm) yorum yapmaktan dolayı özür dilerim. //stackoverflow.com/questions/15270843/what-does-plus-operator-mean-in-underscore-js), ancak "en iyi uygulama bunu yapmak için" gibi bir şey söylemek biraz anlamsızdır. Eğer açıklayamıyorsanız * neden * bir şeyin “en iyi uygulama” olduğunu düşünüyorsunuz, o zaman bunun “en iyi” olduğunu nasıl biliyorsunuz? Farklı durumlarda farklı şeyler en iyisidir. –

+0

@ PaulD.Waite Sorun değil. Gelişimi ile ilerlemeye çalışan bir geliştirici olarak, belirli bir kütüphanenin öğrenmelerine yardımcı olacak en iyi uygulamaları takip edip etmediği hakkında sorular sormak aklımda kabul edilebilir. Toplumun büyük destek vermemesi çok sinir bozucu. Belirli bir kütüphanenin en iyi uygulamalar kullanılarak yazıldığına inanmıyorum ve yanlış yapmadığım bir şey olduğundan emin olmaya çalışıyorum, bu yüzden kod eklediğimde bunun olabileceğinden emin olabilirim. – Sethen

cevap

14
A class constant :: kapsam operatörü ile erişilen

ve hiçbir dolar işareti, bu yüzden:

DÜZENLEME

Bu işe olacağını varsayabiliriz (ve) olur koddur Statik sınıf özellikleri ve sınıf sabitleri arasında ayrım yapmak için $ gereklidir.

class myClass { 
    public static $staticProp = "static property"; 

    const CLASS_CONSTANT = 'a constant'; 
} 

echo myClass::CLASS_CONSTANT; 
echo myClass::$staticProp; 

Yani bir değişken erişmek için, $ gereklidir. Ancak $, sınıf adının başına $myClass::staticProp gibi yerleştirilemez, çünkü sınıf adı ayrıştırıcı tarafından tanımlanamaz çünkü sınıf adı olarak bir değişken kullanmak da mümkündür. Bu nedenle mülke eklenmelidir.

$myClass = "SomeClassName"; 
// This attempts to access a constant called staticProp 
// in a class called "SomeClassName" 
echo $myClass::staticProp; 

// Really, we need 
echo myClass::$staticProp; 
+0

+1 onu bana –

+0

'$ myClass'' $ myClass = new myClass' i temsil etmesi gerekiyordu. – Sethen

+0

O zaman hiçbir anlam ifade etmiyorsunuz. $ staticProp bir sınıf değişkeni, örnek değişken değil, dolayısıyla bir sınıf örneği tarafından çağrılmaz. –

0

Onun Açgözlü! Bazı temel işlevlerdeki işlevlere ve değişkenlere başvurmak veya henüz hiç örneği olmayan sınıflardaki işlevlere başvurmak bazen faydalıdır. :: Operatör bunun için kullanılıyor.

<?php 
class A 
{ 
    function example() 
    { 
     echo "I am the original function A::example().<br>\n"; 
    } 
} 

class B extends A 
{ 
    function example() 
    { 
     echo "I am the redefined function B::example().<br>\n"; 
     A::example(); 
    } 
} 

// there is no object of class A. 
// this will print 
// I am the original function A::example().<br> 
A::example(); 

// create an object of class B. 
$b = new B; 

// this will print 
// I am the redefined function B::example().<br> 
// I am the original function A::example().<br> 
$b->example(); 
?> 

Yukarıdaki örnek sınıf A'da fonksiyon örneği() çağırır, ama biz $ a-> örnek() veya benzer yazamıyor böylece sınıf A hiçbir nesne yoktur. Bunun yerine, örnek() 'sınıf fonksiyonu' olarak adlandırıyoruz, yani sınıfın kendisinin bir fonksiyonu olarak, bu sınıfın herhangi bir nesnesini değil.

Sınıf işlevleri vardır, ancak sınıf değişkenleri yoktur. Aslında, çağrı sırasında hiç bir nesne yoktur. Böylece, bir sınıf fonksiyonu herhangi bir nesne değişkenini kullanamaz (ancak yerel ve global değişkenleri kullanabilir) ve bunu hiç kullanamaz.

Yukarıdaki örnekte, B sınıfı, işlev örneğini() yeniden tanımlar. Özellikle A sınıfındaki (-) operatörünü kullanarak örnek() 'in uygulanmasına atıfta bulunmadığınız sürece, A sınıfındaki orijinal tanımlama gölgeli ve artık kullanılamaz.Bunu yapmak için A :: example() yazın (aslında, parent :: example() yazmalısınız).

Bu bağlamda, geçerli bir nesne var ve nesne değişkenleri olabilir. Bu nedenle, bir nesne işlevi WITHIN kullanıldığında, $ this ve object değişkenlerini kullanabilirsiniz.