2010-08-25 2 views
3

je sais que vous pouvez affecter la valeur de retour d'une fonction à une variable et de l'utiliser, comme ceci:Affectation du résultat d'une fonction à une variable dans une classe PHP? POO Weirdness

function standardModel() 
{ 
    return "Higgs Boson"; 
} 

$nextBigThing = standardModel(); 

echo $nextBigThing; 

Alors quelqu'un s'il vous plaît me dire pourquoi ce qui suit ne fonctionne pas? Ou n'est-ce pas encore implémenté? Est-ce que je manque quelque chose?

class standardModel 
{ 
    private function nextBigThing() 
    { 
     return "Higgs Boson"; 
    } 

    public $nextBigThing = $this->nextBigThing(); 
} 

$standardModel = new standardModel; 

echo $standardModel->nextBigThing; // get var, not the function directly 

Je sais que je pouvais faire:

class standardModel 
{ 
    // Public instead of private 
    public function nextBigThing() 
    { 
     return "Higgs Boson"; 
    } 
} 

$standardModel = new standardModel; 

echo $standardModel->nextBigThing(); // Call to the function itself 

Mais dans le cas de mon projet, toutes les informations stockées dans la classe sont vars publics prédéfinis, sauf un d'entre eux, qui doit calculer la valeur à l'exécution.

Je le veux cohérent donc moi-même ou tout autre développeur utilisant ce projet doit se rappeler qu'une valeur doit être un appel de fonction plutôt qu'un appel var.

Mais ne vous inquiétez pas pour mon projet, je me demande principalement pourquoi l'incohérence dans l'interpréteur de PHP? De toute évidence, les exemples sont faits pour simplifier les choses. S'il vous plaît ne pas question "pourquoi" je dois mettre cette fonction dans la classe. Je n'ai pas besoin d'une leçon sur la bonne POO et c'est juste une preuve de concept. Merci!

Répondre

7
public $nextBigThing = $this->nextBigThing(); 

Vous ne pouvez initialize class members with constant values. C'est à dire. vous ne pouvez pas utiliser de fonctions ou d'expression à ce stade. De plus, la classe n'est même pas complètement chargée à ce stade, donc même si cela était autorisé, vous ne pourriez probablement pas appeler ses propres fonctions pendant qu'elle est encore en construction.

Faites ceci:

class standardModel { 

    public $nextBigThing = null; 

    public function __construct() { 
     $this->nextBigThing = $this->nextBigThing(); 
    } 

    private function nextBigThing() { 
     return "Higgs Boson"; 
    } 

} 
+0

DOH Pourquoi ne pas que je pense à essayer cela. Merci mec. – Jay

6

Vous ne pouvez pas affecter des valeurs par défaut à des propriétés telles que, à moins que cette valeur est d'un type de données constant (par exemple sous forme de chaîne, int ... etc). Tout ce qui traite essentiellement le code (comme une fonction, même les valeurs $ _SESSION) ne peut pas être affecté comme valeur par défaut à une propriété. Ce que vous pouvez faire est d'assigner la propriété quelle que soit la valeur que vous voulez dans un constructeur.

class test { 
    private $test_priv_prop; 

    public function __construct(){ 
     $this->test_priv_prop = $this->test_method(); 
    } 

    public function test_method(){ 
     return "some value"; 
    } 
} 
-2
class standardModel 
{ 
// Public instead of private 
public function nextBigThing() 
{ 
    return "Higgs Boson"; 
} 
} 

$standardModel = new standardModel(); // corection 

echo $standardModel->nextBigThing(); 
Questions connexes