2011-02-02 3 views
6

-je en essayant d'apprendre la POO et je l'ai fait cette classePHP - passage de variables aux classes

class boo{ 

    function boo(&another_class, $some_normal_variable){ 
    $some_normal_variable = $another_class->do_something(); 
    } 

    function do_stuff(){ 
    // how can I access '$another_class' and '$some_normal_variable' here? 
    return $another_class->get($some_normal_variable); 
    } 

} 

et j'appeler cela quelque part à l'intérieur de la classe another_class comme

$bla = new boo($bla, $foo); 
echo $bla->do_stuff(); 

Mais je ne savoir comment accéder à $ bla, $ foo dans la fonction do_stuff

+5

* (référence) * [classes et les objets de base] (http: // www .php.net/manual/fr/language.oop5.basic.php) – Gordon

+0

En savoir plus sur '$ this' sur http://docs.php.net/this! – rik

Répondre

12
<?php 
class Boo 
{ 

    private $bar; 

    public function setBar($value) 
    { 
     $this->bar = $value; 
    } 

    public function getValue() 
    { 
     return $this->bar; 
    } 

} 

$x = new Boo(); 
$x->setBar(15); 
print 'Value of bar: ' . $x->getValue() . PHP_EOL; 

S'il vous plaît ne passe pas par référence PHP 5, il n'y en a pas besoin et j'ai lu que c'est en fait plus lent. J'ai déclaré la variable dans la classe, mais vous n'avez pas à le faire.

+0

Comme @Logan a dit - Bottom line est si vous voulez enregistrer quelques informations - alors vous devez l'enregistrer dans la classe locale. – Mikhail

+4

Je ne ferais pas l'instruction blanket "ne pas passer par référence en PHP5." Peut-être pas pour la composition, mais que faire si vous vouliez modifier un tableau en place? Passer par référence a ses avantages. –

+0

vous devriez probablement dire "il y a * rarement * un besoin". Dans la plupart des cas, c'est inutile. – zzzzBov

3

En PHP, les constructeurs et les destructeurs sont écrits avec des noms spéciaux (__construct() et __destruct(), respectivement). Accédez aux variables d'instance en utilisant $this->. Voici une ré-écriture de votre classe à utiliser ceci:

class boo{ 

    function __construct(&another_class, $some_normal_variable){ 
    $this->another_class = $another_class; 
    $this->some_normal_variable = $another_class->do_something(); 
    } 

    function do_stuff(){ 
    // how can I access '$another_class' and '$some_normal_variable' here? 
    return $this->another_class->get($this->some_normal_variable); 
    } 

} 
+0

"Pour la rétrocompatibilité, si PHP 5 ne peut pas trouver une fonction __construct() pour une classe donnée, elle cherchera la fonction constructeur de l'ancien style, par le nom de la classe.En effet, cela signifie que le seul cas qui aurait problèmes de compatibilité est si la classe a une méthode nommée __construct() qui a été utilisée pour différentes sémantiques. " - [PHP Constructors and Destructors] (http://www.php.net/manual/fr/language.oop5.decon.php). L'utilisation de la nouvelle syntaxe est toujours une bonne idée, car la rétrocompatibilité pourrait être supprimée à l'avenir. – zzzzBov

+0

@zzzzBov droite, je ne dirais jamais à quelqu'un de commencer à utiliser quelque chose qui était obsolète. IMO ce style est plus clair. –

+0

J'essayais juste de clarifier la raison pour laquelle le code de @ Alexandra fonctionne (pour le constructeur). – zzzzBov

9

Ok, d'abord, utilisez le constructeur de nouveau style __construct au lieu d'une méthode avec le nom de la classe.

class boo{ 

    public function __construct($another_class, $some_normal_variable){ 

Deuxièmement, pour répondre à votre question, vous devez utiliser member variables/properties:

class boo { 
    protected $another_class = null; 
    protected $some_normal_variable = null; 

    public function __construct($another_class, $some_normal_variable){ 
     $this->another_class = $another_class; 
     $this->some_normal_variable = $some_normal_variable; 
    } 

    function do_stuff(){ 
     return $this->another_class->get($this->some_normal_variable); 
    } 
} 

Maintenant, notez que pour les variables membres, à l'intérieur de la classe que nous les référençons en les préfixant avec $this->. En effet, la propriété est liée à cette instance de la classe. C'est ce que vous cherchez ...

1

Vous devez saisir les valeurs de la classe en utilisant $ ceci:

$this->foo = $some_normal_variable 
Questions connexes