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

El objeto del objeto!?

Estas en el tema de El objeto del objeto!? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. La verdad no sé como se llama pero voy a tratar de explicar lo que estoy necesitando quiero realizar una estructura para armar una cadena ...
  #1 (permalink)  
Antiguo 29/08/2009, 00:24
 
Fecha de Ingreso: mayo-2009
Mensajes: 25
Antigüedad: 15 años
Puntos: 1
El objeto del objeto!?

La verdad no sé como se llama pero voy a tratar de explicar lo que estoy necesitando

quiero realizar una estructura para armar una cadena de texto
la cadena de texto puede ir variando de parte en parte y mi idea es que pueda manejarla de la siguiente forma

$ob = new clase;
$resultado = $ob->primera("tatata").segunda("taptap").tercero("blah blah");

el porque de realizarlo de esta forma y es que cada uno de estas funciones "primera segunda y tercera" tienen un filtrado distinto
entonces me gustaría luego tener la capacidad de recombinar sus formas por ejemplo
$resultado = $ob->tercera("tatata").primera("esto").segunda("algoma s");

y obtener el resultado con los filtrados correctos que yo he creado..
mi problema es que realmente no entiendo como lograr eso de poder llamar desde uno rigen X
cualquiera al resto de los "objetos" o métodos para que funcionen y me armen un solo resultado.
hasta ahroa solo he obtenido el terrible error de FATAL ERROR Call to a member function ... on a non-object in blahblahblah.....

alguien me puede ayudar!? por lo menos decirme como se llama esto que quiero hacer!?
o darme un manual o algo para tratar de entenderlo
según fui hablando y buscando con mis compañeros ellos me dijeron que
la forma de realizarlo es hacer que la función retorne como resultado un objeto no estoy seguro de eso. u.u pero me gustaría que me den una mano.
Desde ya gracias.
  #2 (permalink)  
Antiguo 29/08/2009, 04:00
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: El objeto del objeto!?

se llama encadenamiento
Chaining

salu2.
  #3 (permalink)  
Antiguo 29/08/2009, 13:52
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Respuesta: El objeto del objeto!?

Exacto, se llama "Method Chaining" o Encadenamiento (podríamos traducirlo así). Por lo que veo, tu necesidad reside en tener un administrador de filtros, más los filtros necesarios. Lo que no termino de entender de tu necesidad, es si el método "tercero", "segundo", etc... aplican el filtro SOLO en el texto que le pasás como parámetro.... pero que hace con ese texto? Lo agrega al final del texto anterior?

Si así fuera, lo que te puede servir es lo siguiente. Primero creemos un par de filtros, siguiendo tu ejemplo.

Código PHP:
Ver original
  1. <?php
  2. class Filtro_Primero {
  3.    
  4.     // Esta clase convierte el primer caracter en mayusculas
  5.     public function filtrar($texto) {
  6.         return ucfirst($texto);
  7.     }
  8. }
  9.  
  10. class Filtro_Segundo {
  11.    
  12.     // Esta convierte todo el texto en mayusculas.
  13.     public function filtrar($texto) {
  14.         return strtoupper($texto);
  15.     }
  16. }
  17.  
  18. class Filtro_Tercero {
  19.    
  20.     protected $_lista = array('spam', 'bot', 'spyware');
  21.    
  22.     // Esta clase toma un texto y remueve ciertas palabras
  23.     public function filtrar($texto) {
  24.         return str_replace($this->_lista, '', $texto);
  25.     }
  26. }

Y luego creemos un administrador de filtros, que te permitirá manejar todo desde una clase central. Voy a hacerlo BIEN simple, para evitar otro tipo de complejidad innecesaria, pero sepan entender que no es una implemnetación "correcta":

Código PHP:
Ver original
  1. <?php
  2. class Administrador_Filtros {
  3.    
  4.     protected $filtros = array();
  5.    
  6.     protected $texto = '';
  7.    
  8.     public function __construct() {
  9.         $this->filtros = array(
  10.             'primero' => new Filtro_Primero,
  11.             'segundo' => new Filtro_Segundo,
  12.             'tercero' => new Filtro_Tercero
  13.         );
  14.     }
  15.    
  16.     public function primero($texto) {
  17.         $this->texto.= $this->filtros['primero']->filtrar($texto);
  18.         return $this;
  19.     }
  20.    
  21.     public function segundo($texto) {
  22.         $this->texto.= $this->filtros['segundo']->filtrar($texto);
  23.         return $this;
  24.     }
  25.    
  26.     public function tercero($texto) {
  27.         $this->texto.= $this->filtros['tercero']->filtrar($texto);
  28.         return $this;
  29.     }
  30.    
  31.     public function __toString() {
  32.         return $this->texto;
  33.     }
  34. }
Finalmente, lo podemos utilizar muy fácilmente, este es un ejemplo :
Código PHP:
Ver original
  1. <?php
  2. $texto = new Administrador_Filtros();
  3. $texto->primero('espero tengamos ')->segundo('suerte ')->tercero('bot bot con spam esto.');
  4. echo $texto;
  5.  
  6. // esto muestra por pantalla : "Espero tengamos SUERTE con esto."

Espero sinceramente que esto sea lo que estabas buscando :D
Suerte !
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #4 (permalink)  
Antiguo 30/08/2009, 07:13
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: El objeto del objeto!?

Que tal Morpheus747

Esto también lo puedes hacer con "interfaces fluidas" (fluent interface) y es mucho más sencillo (Zend Framework lo usa constantemente).

Simplemente dentro del mismo objeto tienes métodos de filtro que puedes invocar anidadamente:

$objeto->setFiltro1($datos)->setFiltro2($datos)->setFiltro3($datos3);

ó

$resultado = $objeto->setFiltro1($datos)->setFiltro2($datos)->setFiltro3($datos3);

Y simplemente se hace con un return $this en cada método, lo que permite que puedas anidar las invocaciones, ya que siempre retornas la instancia del mismo objeto, por lo tanto la invocación siguiente se aplica sobre el mismo objeto.

Por ejemplo, esta práctica es muy común verla en Java (JSE), también en PHP en Zend Frameworks con set's de distintos atributos y para no tener que llamarlo separadamente se puede hacer anidado, también es común verlo en los frameworks javascripts (jQuery, etc), que van anidando distintos modificadores en la misma línea.

Código PHP:
class Cliente
{
   private 
$_nombre;
   private 
$_apellido;
   private 
$_nacimiento;

   public function 
setNombre($nombre)
   {
       
$this->_nombre $nombre;
       return 
$this;
   }
   public function 
setApellido($apellido)
   {
       
$this->_apellido $apellido;
       return 
$this;
   }
   public function 
setNacimiento($fecha)
   {
       
$this->_nacimiento $fecha;
       return 
$this;
   }
}

$cliente = new Cliente();

$cliente->setNombre('Enrique')->setApellido('Place')->setNacimiento('5/8/1973');

// También puedes hacerlo de esta manera y es lo mismo

$cliente->setNombre('Enrique')
   ->
setApellido('Place')
   ->
setNacimiento('5/8/1973'); 
Importante: ojo, hay que tener cuidado con esta práctica y no abusar, ya quemás de 3 invocaciones anidadas puede dificultar la lectura de lo que se está intentando hacer.

PD: para todos, traten de usar el estándar de codificación PHP de Zend, su uso nos beneficia a todos.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com

Última edición por enriqueplace; 30/08/2009 a las 10:33
  #5 (permalink)  
Antiguo 30/08/2009, 10:07
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Respuesta: El objeto del objeto!?

Oh, que bueno que has retornado al foro, enriqueplace. Todos nos vamos a volver a beneficiar del tiempo que le dedicabas antes.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #6 (permalink)  
Antiguo 30/08/2009, 10:39
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: El objeto del objeto!?

Webstudio, no te confundas. Luego del papelón perpretado por ForosDelWeb, principalmente Cvander y sus séquitos (como sacarme el título de "colaborador" porque supuestamente soy un "provocador), lo último que haría sería invertir mi poco tiempo para beneficiarlos.

Me preocupan principalmente los usuarios y a ellos me debo, y como no tengo pensado crear otro foro, prefiero tratar de ayudar a los desarrolladores php en lo más que pueda (a pesar de forosdelweb)


Ni más, ni menos.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #7 (permalink)  
Antiguo 30/08/2009, 11:03
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Respuesta: El objeto del objeto!?

Creeme, no necesitás poner links, ya se hizo suficiente escándalo al respecto como para que me enterara. Igualmente si leyeras lo que puse, puse "Todos nos vamos a beneficiar" y a "Todos" me refiero a los usuarios. Así que tu aclaración quedó lisa y llanamente de más.

Igualmente, vuelvo a expresar mi sentimiento de alegría.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #8 (permalink)  
Antiguo 30/08/2009, 14:26
 
Fecha de Ingreso: mayo-2009
Mensajes: 25
Antigüedad: 15 años
Puntos: 1
Respuesta: El objeto del objeto!?

BUENISIMO MUCHAS GRACIAS han resuelto mi problema ampliamente!
genial!
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 16:26.