Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Problema con fluent interface / Funciones Anidadas

Estas en el tema de Problema con fluent interface / Funciones Anidadas en el foro de Frameworks y PHP orientado a objetos en Foros del Web. fluent interface esta habilitado a partir de php5, en php4 no funciona, me refiero a cuando hacemos lo siguiente: Código PHP: $Objetc  = new  unObjeto (); ...
  #1 (permalink)  
Antiguo 13/03/2011, 10:28
 
Fecha de Ingreso: diciembre-2010
Mensajes: 13
Antigüedad: 14 años
Puntos: 0
Problema con fluent interface / Funciones Anidadas

fluent interface esta habilitado a partir de php5, en php4 no funciona, me refiero a cuando hacemos lo siguiente:

Código PHP:
$Objetc = new unObjeto();

$Object->setAlgo(1)->setOtraCosa(2)->setUnaCosaMas(3); 
En el quickstart de zend se usa en el datamapper y tambien siempre lo use en otras circunstancias

Ejemplo:

Código PHP:
public function find($idApplication_Model_Guestbook $guestbook)
    {
        
$result $this->getDbTable()->find($id);
        if (
== count($result)) {
            return;
        }
        
$row $result->current();
        
$guestbook->setId($row->id)
                  ->
setEmail($row->email)
                  ->
setComment($row->comment)
                  ->
setCreated($row->created);
    } 
El tema es que no entiendo por que me da error cuando lo hago de esta manera.

Error: Fatal error: Call to a member function setEmail() on a non-object in...

Ahora si lo hago como en php4 funciona todo perfecto, ejemplo:

Código PHP:
public function find($idApplication_Model_Guestbook $guestbook)
    {
        
$result $this->getDbTable()->find($id);
        if (
== count($result)) {
            return;
        }
        
$row $result->current();
        
$guestbook->setId($row->id)
        
$guestbook->setEmail($row->email)
        
$guestbook->setComment($row->comment)
        
$guestbook->setCreated($row->created);
    } 
Obviamente tengo php5, no entiendo por que no funciona, a alguien le paso?
  #2 (permalink)  
Antiguo 13/03/2011, 10:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Problema con fluent interface / Funciones Anidadas

Como esta tu model guestbook?
  #3 (permalink)  
Antiguo 13/03/2011, 10:51
 
Fecha de Ingreso: diciembre-2010
Mensajes: 13
Antigüedad: 14 años
Puntos: 0
Respuesta: Problema con fluent interface / Funciones Anidadas

En realidad el objeto es de la clase My_Producto

Código PHP:
class My_Producto
{
    protected 
$_id null;
    protected 
$_nombre null;
    protected 
$_descripcion null;
    
    public function 
getId(){
        return 
$this->_id;
    }

    public function 
getNombre(){
        return 
$this->_nombre;
    }

    public function 
getDescripcion(){
        return 
$this->_descripcion;
    }

    public function 
setId($id){
        
$this->_id $id;
    }

    public function 
setNombre($nombre){
        
$this->_nombre $nombre;
    }

    public function 
setDescripcion($descripcion){
        
$this->_descripcion $descripcion;
    }

?> 
y en el mapper:

Código PHP:

public function find($idMy_Producto $producto) {
       
            
$result $this->getDbTable()->find($id);
            if (
== count($result)) {
                return;
            }
            
$row $result->current();

            
$producto->setId($row->id)        
                    ->
setNombre($row->nombre)
                    ->
setDescripcion($row->descripcion);
            
    } 
El error:

Fatal error: Call to a member function setNombre() on a non-object in /home/tienda/www/web/application/models/mappers/ProductosMapper.php on line 68


Si lo hago de las siguiente manera funciona perfecto:

Código PHP:

public function find($idMy_Producto $producto) {
        
            
$result $this->getDbTable()->find($id);
            if (
== count($result)) {
                return;
            }
            
$row $result->current();

            
$producto->setId($row->id);
            
$producto->setNombre($row->nombre);
            
$producto->setDescripcion($row->descripcion);
            
       
    } 
Netbeans no me tira ningun error de codigo, quizás algo en la configuración de php?
  #4 (permalink)  
Antiguo 13/03/2011, 10:59
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Problema con fluent interface / Funciones Anidadas

Fluent interface es una forma de hacer las cosas, no algo que se active en PHP, y para que funcione los setters deben devolver el objeto.

Código PHP:
Ver original
  1. public function setNombre($nombre)
  2. {
  3.     $this->_nombre = $nombre;
  4.     return $this;
  5. }

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 13/03/2011, 11:08
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 21 años, 7 meses
Puntos: 60
Respuesta: Problema con fluent interface / Funciones Anidadas

Cita:
Iniciado por masterpuppet Ver Mensaje
Fluent interface es una forma de hacer las cosas, no algo que se active en PHP, y para que funcione los setters deben devolver el objeto.
.

Exacto El ejemplo que das NO tiene que ver con PHP 4 PHP 5 ya que eso que haces es algo independiente del lenguaje :s es solo "settear" propiedades o llamar metodos del objeto
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #6 (permalink)  
Antiguo 13/03/2011, 11:48
 
Fecha de Ingreso: diciembre-2010
Mensajes: 13
Antigüedad: 14 años
Puntos: 0
Respuesta: Problema con fluent interface / Funciones Anidadas

Muchas gracias por sus respuestas-

Etiquetas: anidadas, funciones, interface
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:00.