2009-07-06 14 views
39

Sono nuovo al paradigma OOP, quindi c'è probabilmente una semplice spiegazione per questa domanda ...Quando dovrei dichiarare le variabili in una classe PHP?

Hai sempre bisogno di dichiarare variabili pubbliche a livello di oggetto in una classe? Per esempio:

<?php 

class TestClass 
{ 
    var $declaredVar; 

    function __construct() 
    { 
     $this->declaredVar = "I am a declared variable."; 
     $this->undeclaredVar = "I wasn't declared, but I still work."; 
    } 

    function display() 
    { 
     echo $this->declaredVar . "<br />"; 
     echo $this->undeclaredVar; 
     echo "<br /><br />"; 
    } 
} 

$test = new TestClass; 
$test->display(); 

$test->declaredVar = "The declared variable was changed."; 
$test->undeclaredVar = "The undeclared variable was changed."; 

$test->display(); 

?> 

In questo codice, anche se $declaredVar è l'unica variabile dichiarata, $undeclaredVar è altrettanto accessibile e utilizzabile - sembra agire come se avessi dichiarato come pubblico.

Se le variabili di classe non dichiarate sono sempre accessibili in questo modo, che senso hanno dichiararle tutte in primo piano?

risposta

35

quella variabile non è inizializzata, è solo non dichiarato.

Dichiarare le variabili in una definizione di classe è un punto di stile per la leggibilità. Inoltre è possibile impostare l'accessibilità (privata o pubblica).

In ogni caso, dichiarare le variabili in modo esplicito non ha nulla a che fare con OOP, è specifico del linguaggio di programmazione. In Java non puoi farlo perché le variabili devono essere dichiarate esplicitamente.

+2

Quindi è solo perché PHP è davvero clemente che le variabili non dichiarate funzionano, giusto? – Andrew

+1

Giusto. PHP dovrebbe comunque emettere un avvertimento ... inserire error_reporting (E_ALL); nella parte superiore del tuo file. – Stephan202

+0

non tanto indulgente come interpretato –

1

Il paradigma generale di incapsulamento OOP dice che non dovresti esporre le tue variabili di stato interiore lato che significa che dovrebbero essere private, che ti permette di cambiare un'implementazione della tua classe senza bisogno di cambiare il codice dove la usi. È preferibile inizializzare le variabili tramite il metodo dei costruttori e dei getter e setter della classe.

13

Se si dichiara un membro all'interno della classe è possibile impostare la sua accessibilità per esempio

private $varname; 
+5

NB: Questo è stato supportato solo da PHP 5 (nel caso in cui sei bloccato sull'albero 4.x), ma sono d'accordo sul fatto che l'impostazione esplicita di visibilità di variabili e metodi è una buona pratica - solo perché PHP l'interprete non lo richiede non significa che non dovresti usarlo. –

0

In generale le variabili devono essere inizializzate non appena si dispone di informazioni sufficienti per farlo correttamente.

Se una variabile di classe richiede che determinate informazioni vengano inizializzate in modo sensato, è necessario che tali informazioni vengano trasmesse al costruttore.

Utilizzando la sintassi di PHP per dichiarare implicitamente variabili al punto di definizione, IMHO è un modo infallibile per introdurre i bug - se la classe ha bisogno di una variabile, quindi dichiararla, e utilizzare tutte le informazioni che nascondono che OOP ti offre.

9

È sempre necessario dichiarare le variabili membro e specificare la loro accessibilità all'interno delle classi. Mi piace mettere queste informazioni alla fine della lezione dopo le mie funzioni.

È necessario definirli non appena si dispone di informazioni sufficienti per farlo. Forse nel costruttore o tramite le funzioni di setter.

È importante farlo perché rende la vita molto più semplice alle persone che lavorano con il codice. Non devono indovinare da dove provengono le diverse proprietà o perché sono lì. Inoltre, la maggior parte degli IDE (se non tutti) non viene rilevata sulle variabili di classe a meno che non le abbia dichiarate da qualche parte. Il completamento/i suggerimenti del codice sono uno dei molti vantaggi degli IDE e senza dichiarare le variabili, si renderà inutile tale funzionalità.

+0

"Dovresti definirli non appena hai abbastanza informazioni per farlo." Ha importanza se questo è prima del costruttore o nel costruttore o in un setter fuction? – tehlivi

0

Come ha detto Federico Culloca "Quella variabile non è non inizializzata, è solo non dichiarata". Inoltre non hai definito alcun modificatore di accesso per loro in modo che si comportassero come un modificatore pubblico applicato a loro.

Forse avete già saputo. PHP è un linguaggio vagamente dattiloscritto.Ma un programmatore dovrebbe sempre seguire le migliori pratiche (ma non usare i tipi di dati primitivi in ​​php).

È necessario utilizzare il modificatore privato per le variabili di livello di classe e fornire i metodi di accesso e mutatore (Getter e setter) per loro.

Problemi correlati