2010-09-22 15 views
5

Ok, he estado navegando un poco de código fuente PHP y necesita saber cómo la clase siguiente y métodos sub utilizan obras:¿Alguien puede explicar cómo funciona esto?

<?php 
$me = new Person; 
$me->name("Franky")->surname("Chanyau")->phone("+22", "456 789"); 
?> 

tengo conocimiento bastante sólido de la programación orientada a objetos, así que no quiero un 101. Solo necesito saber cómo hacer que el código anterior sea posible.

Saludos Franky

+0

* (relacionado) * [método de encadenamiento] (http : //stackoverflow.com/search? q = method + chaining + php) – Gordon

+1

Esta técnica también se puede utilizar para implementar una interfaz fluida: http://en.wikipedia.org/wiki/Fluent_interface –

+0

@Dennis Haarbrink - Nice. Nunca escuché hablar de ese término antes. Gracias por el enlace. –

Respuesta

12

método de encadenamiento es posible, por

return $this; 

al final del método.

se explica aquí: phpandstuff: Method Chaining Plus Magic Setters

Estos métodos suelen establecer una variable de instancia y luego simplemente regresan $ esto.

public function phone($param) { 
    $this->phone = $param; 
    return $this; 
} 
+0

+1 para usar la palabra clave encadenamiento. –

+0

Ok, ¿también sería posible calcular la cadena pero en lugar de devolver $ this, devuelve otro objeto que creó? –

+0

@Franky es posible, pero estrictamente hablando, Method Chaining devuelve el objeto host. Una vez que comienzas a devolver diferentes objetos, vas en la dirección de una interfaz fluida (para crear una DSL). Estos dos a menudo están confundidos. – Gordon

3

métodos name()surname() y phone() devolver una instancia de la persona. Esto se puede hacer por

return $this; 

muy probablemente estos métodos tener este aspecto:

public function name($name) { 
    $this->name = $name; 
    return $this; 
} 
3

al igual que algunos otros dijeron, es una interfaz fluida http://en.wikipedia.org/wiki/Fluent_interface#PHP La idea básica es que una methof de una clase siempre devuelve el objeto en sí

class Car { 
    private $speed; 
    private $color; 
    private $doors; 

    public function setSpeed($speed){ 
     $this->speed = $speed; 
     return $this; 
    } 

    public function setColor($color) { 
     $this->color = $color; 
     return $this; 
    } 

    public function setDoors($doors) { 
     $this->doors = $doors; 
     return $this; 
    } 
} 

// Fluent interface 
$myCar = new Car(); 
$myCar->setSpeed(100)->setColor('blue')->setDoors(5); 

(vía wiki)

+0

No lo es. Existe una diferencia conceptual entre * simple * Método de encadenamiento y una interfaz fluida. Método Encadenamiento, según la definición de Fowler, devuelve el objeto host. Una interfaz fluida tiene como objetivo crear un DSL. Una interfaz fluida puede usar cadenas de métodos (entre otras técnicas), pero una cadena de métodos no es una interfaz fluida. Un ejemplo de una interfaz fluida sería 'Zend_Db_Table':' $ table-> select() -> from ('foo') -> where ('bar = baz') -> assemble(); ' – Gordon

+0

tiene razón, no cada vez que uso Method Chaining es una interfaz fluida, pero no llegaría tan lejos como para decir si eso es lo que quiere lograr una interfaz fluida o simplemente Method Chaining ... – Hannes

0

La idea es si devolvemos $ this entonces podemos encadenar las llamadas al método de objeto juntos. Aquí está la solución:

<?php 

    class Person 
    { 
     private $strName; 
     private $strSurname; 
     private $ArrPhone = array(); 

     public function name($strName) 
     { 
      $this->strName = $strName; 
      return $this; // returns $this i.e Person 
     } 

     public function surname($strSurname) 
     { 
      $this->strSurname = $strSurname; 
      return $this; // returns $this i.e Person 
     } 

     public function phone() 
     { $this->ArrPhone = func_get_args(); //get arguments as array 
      return $this; // returns $this i.e Person 
     } 

     public function __toString() 
     { 
      return $this->strName." ".$this->strSurname.", ".implode(" ",$this->ArrPhone); 
     } 
    } 

    $me = new Person; 
    echo $me->name("Franky")->surname("Chanyau")->phone("+22", "456 789"); 

?> 
0

Las respuestas correctas, pero para hacer el trabajo código que debe escribir:

$me = new Person(); 

en lugar de

$me = new Person; 
+1

http://php.net/manual/ es/language.types.object.php - De hecho ... Eche un vistazo a la documentación oficial de php, no usan() para crear un nuevo objeto. Solo necesitaría los corchetes para enviar variables al método __construct() de la clase. –

Cuestiones relacionadas