2013-03-12 11 views
7

Ultimamente ho intensificato il mio gioco PHP. Venendo da JavaScript, ho trovato che il modello a oggetti è un po 'più semplice da capire.Accesso alla proprietà PHP e simbolo del dollaro

Ho incontrato alcune stranezze che volevo chiarire su ciò che non riesco a trovare nella documentazione.

Quando si definiscono le classi in PHP, è possibile definire le proprietà in questo modo:

class myClass { 

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

} 

Con la variabile pubblica di $myProp possiamo accedervi utilizzando (supponendo myClass viene fatto riferimento in una variabile chiamata $myClass) $myClass->myProp senza l'uso del simbolo del dollaro.

È possibile accedere solo alle variabili statiche utilizzando ::. Quindi, possiamo accedere alla variabile statica come $myClass::$anotherProp con un segno di dollaro.

La domanda è, perché dobbiamo usare il simbolo del dollaro con :: e non -> ??

EDIT

Questo è il codice Vorrei assumere avrebbe funzionato (e lo fa):

class SethensClass { 

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

} 

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

Interessante ... One up e una richiesta di chiusura. – Sethen

+0

Ci scusiamo per aver commentato qui [la tua altra domanda] (http://stackoverflow.com/q/17681253/20578) (che, se posta come una serie di singole domande, personalmente ho pensato che sarebbe andata bene - vedi ad esempio http: //stackoverflow.com/questions/15270843/what-does-plus-operator-mean-in-underscore-js), ma dire qualcosa come "la migliore pratica dice di farlo" è un po 'priva di significato. Se non riesci a spiegare * perché * pensi che qualcosa sia una "migliore pratica", allora come fai a sapere che è "il migliore"? Le cose diverse sono le migliori in diverse situazioni. –

+0

@ PaulD.Waite Va bene. Mentre uno sviluppatore cercava di andare avanti con il suo sviluppo, chiedevo se una determinata biblioteca seguisse le migliori pratiche per aiutarli ad apprendere è accettabile nella mia mente. Per la comunità in generale non supportare è molto frustrante. Non credo che quella particolare libreria sia stata scritta usando le migliori pratiche e sto cercando di assicurarmi che sia qualcosa che non sto sbagliando, quindi quando contribuisco al codice posso essere sicuro che sia il migliore possibile. – Sethen

risposta

14

Un class constant si accede con l'operatore ambito ::, e nessun segno di dollaro, in modo che il $ è necessario per distinguere tra proprietà di classe statiche e costanti di classe.

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

    const CLASS_CONSTANT = 'a constant'; 
} 

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

Quindi, per accedere a una variabile, il $ è necessario. Ma il $ non può essere posizionato all'inizio del nome della classe come $myClass::staticProp perché il parser non può identificare il nome della classe, poiché è anche possibile utilizzare una variabile come nome della classe. Deve quindi essere collegato alla proprietà.

$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 mi ha battuto su di esso –

+0

'$ myClass' dovrebbe rappresentare' $ myClass = new myClass'. – Sethen

+0

Allora non hai senso. $ staticProp è una variabile di classe, non una variabile di istanza, quindi non può essere chiamata da un'istanza di classe. –

0

suo avido!

A volte è utile fare riferimento a funzioni e variabili nelle classi base o fare riferimento a funzioni in classi che non hanno ancora alcuna istanza. L'operatore :: viene utilizzato per questo.

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

L'esempio chiama la funzione di esempio() in classe A, ma non c'è un oggetto di classe A, in modo che non si può scrivere $ a-> esempio() o simili. Chiamiamo invece example() come una "funzione di classe", cioè come una funzione della classe stessa, non alcun oggetto di quella classe.

Ci sono funzioni di classe, ma non ci sono variabili di classe. In effetti, non c'è alcun oggetto al momento della chiamata. Quindi, una funzione di classe non può usare alcuna variabile oggetto (ma può usare variabili locali e globali), e potrebbe non utilizzare affatto $ this.

Nell'esempio precedente, la classe B ridefinisce la funzione example(). La definizione originale in classe A è ombreggiata e non più disponibile, a meno che non ci si riferisca specificamente all'implementazione di example() in classe A usando l'operatore :: -.Scrivi A :: example() per fare ciò (in effetti dovresti scrivere genitore :: example()).

In questo contesto, c'è un oggetto corrente e può avere variabili oggetto. Pertanto, se utilizzato da WITHIN una funzione oggetto, è possibile utilizzare $ this e le variabili oggetto.

Problemi correlati