2011-02-02 32 views
6

que tratan de aprender programación orientada a objetos y he hecho esta clasePHP - pasar variables a clases

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); 
    } 

} 

y llamar a esto en alguna parte dentro de la clase another_class como

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

pero no lo hago saber cómo acceder $ bla, $ foo dentro de la función do_stuff

+5

* (de referencia) * [clases y objetos Fundamentos] (http: // www .php.net/manual/es/language.oop5.basic.php) – Gordon

+0

Lea sobre '$ this' en http://docs.php.net/this! – rik

Respuesta

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; 

No transferir para referencia en PHP 5, no hay necesidad y he leído que en realidad es más lento.

He declarado la variable en la clase, aunque no tienes que hacer eso.

+0

Como dijo @Logan: en pocas palabras, si quiere guardar algo de información, debe guardarla en la clase local. – Mikhail

+4

No haría la declaración general "no pase por referencia en PHP5". Tal vez no para la composición, pero ¿y si quisieras modificar una matriz en su lugar? Pasar por referencia tiene sus ventajas. –

+0

probablemente debería decir "hay * rara vez * una necesidad". En la mayoría de los casos, es innecesario. – zzzzBov

3

En PHP, los constructores y los destructores están escritos con nombres especiales (__construct() y __destruct(), respectivamente). Acceda a variables de instancia usando $this->. Aquí está una reescritura de la clase que se utiliza esto:

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

"Para compatibilidad con versiones anteriores, si PHP 5 no puede encontrar una función __construct() para una clase dada, buscará la función de constructor de estilo antiguo, por el nombre de la clase. Efectivamente, significa que el único caso que tendría problemas de compatibilidad es si la clase tenía un método llamado __construct() que se utilizó para semántica diferente. " - [PHP Constructors and Destructors] (http://www.php.net/manual/en/language.oop5.decon.php). El uso de la nueva sintaxis sigue siendo una buena idea, ya que la compatibilidad con versiones anteriores puede abandonarse en el futuro. – zzzzBov

+0

@zzzzBov correcto, nunca le diría a alguien que empiece a usar algo que ya no está en uso. IMO este estilo es más claro. –

+0

Solo intentaba aclarar por qué funciona el código de @ Alexandra (para el constructor). – zzzzBov

9

Ok, en primer lugar, utilice el nuevo constructor de estilo __construct en lugar de un método con el nombre de la clase.

class boo{ 

    public function __construct($another_class, $some_normal_variable){ 

En segundo lugar, para responder a su pregunta específica, es necesario utilizar 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); 
    } 
} 

Ahora, tenga en cuenta que para las variables miembro, dentro de la clase que hacen referencia a ellos mediante un prefijo con $this->. Esto se debe a que la propiedad está limitada a esta instancia de la clase. Eso es lo que está buscando ...

1

Es necesario capturar los valores de la clase utilizando este $:

$this->foo = $some_normal_variable