2010-02-21 22 views
12

Comúnmente, en muchos frameworks, puede encontrar ejemplos de cómo crear una consulta utilizando el generador de consultas. A menudo verá:Método cadenas PHP OOP

$query->select('field'); 
$query->from('entity'); 

Sin embargo, en algunos marcos también puede hacerlo de esta manera

$object->select('field') 
     ->from('table') 
     ->where(new Object_Evaluate('x')) 
     ->limit(1) 
     ->order('x', 'ASC'); 

¿Cómo se hace esto en realidad tipos de cadenas?

Respuesta

18

Esto se llama Fluent Interface - hay un example in PHP en esa página.

La idea básica es que cada método (que desea ser capaz de cadena) de la clase tiene que volver $this - que hace posible llamar a otros métodos de esa misma clase en la $this devuelto.

Y, por supuesto, cada método tiene acceso a las propiedades de la instancia actual de la clase, lo que significa que cada método puede "agregar información" a la instancia actual.

+0

De nada :-) ;; sí, cada método puede establecer/cambiar propiedades, y el "último" método se usa a menudo para "ejecutar" lo que se llamó a los métodos anteriores para configurar. –

+0

No estoy seguro si uso una interfaz fluida siempre hará que el código sea más fácil de leer ;;; cuando se usa para construir alguna consulta SQL, por ejemplo, tiene sentido; pero cuando los métodos no están realmente relacionados, no tan seguros, depende de la situación, supongo ;;; una gran cosa es que incluso si tus métodos devuelven '$ this', se pueden llamar" de forma típica ". –

+0

¿Tiene que devolver '$ this'? ¿No puede devolver '$ that' y continuar desde allí? –

2
class c 
{ 
    function select(...) 
    { 
    ... 
    return $this; 
    } 
    function from(...) 
    { 
    ... 
    return $this; 
    } 
    ... 
} 

$object = new c; 
7

Básicamente, usted tiene que hacer todos los métodos de la clase devolver la instancia:

<?php 

class Object_Evaluate{ 
    private $x; 
    public function __construct($x){ 
     $this->x = $x; 
    } 
    public function __toString(){ 
     return 'condition is ' . $this->x; 
    } 
} 
class Foo{ 
    public function select($what){ 
     echo "I'm selecting $what\n"; 
     return $this; 
    } 
    public function from($where){ 
     echo "From $where\n"; 
     return $this; 
    } 
    public function where($condition){ 
     echo "Where $condition\n"; 
     return $this; 
    } 
    public function limit($condition){ 
     echo "Limited by $condition\n"; 
     return $this; 
    } 
    public function order($order){ 
     echo "Order by $order\n"; 
     return $this; 
    } 
} 

$object = new Foo; 

$object->select('something') 
     ->from('table') 
     ->where(new Object_Evaluate('x')) 
     ->limit(1) 
     ->order('x'); 

?> 

Esto se utiliza a menudo como puro ojos dulces pero supongo que tiene sus usos válidos también.

+0

Caso de uso: '$ setup = $ Object-> add_component ($ component_property) -> configure ($ component_properties);' Donde Object :: add_component() devuelve el objeto Component que agregó como una propiedad de $ Object (por ejemplo, a un array), y está configurado con el método Component :: configure(). Sin encadenamiento, tendríamos que determinar el último elemento agregado a la matriz $ Object-> Components, luego obtener el objeto Component de esa manera. – AVProgrammer

+0

@AVProgrammer: su ejemplo no hace uso de 'return $ this', ¿o sí? –

+0

Sí lo hace, el objeto Component hace esto, para permitir el método configure(). – AVProgrammer