Retroceder   Foros del Web > Programación para sitios web > PHP > PHP orientado a objetos

Respuesta
 
Herramientas Desplegado
Antiguo 29-mar-2007, 19:43   #1 (permalink)
guarus ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
Pregunta $PHP->Orientado_a_objetos()

Versión de PHP: 5
Pregunta: Como se implementa la agregacion y composicion en php

Saludos a la gente de la comunidad, me gustaria que alguien me diera un ejemplo de como implementar, tanto la agregacion y la composicion en php 5 por separado, y si es posible una explicacion del codigo, ya que buscado mucho en internet y no he podido conseguir nada al respecto.

Agradeceria su ayuda, gracias
guarus está desconectado   Responder Citando
Antiguo 30-mar-2007, 05:51   #2 (permalink)
Colaborador
enriqueplace tiene algunos puntos positivos de karma
 
Avatar de enriqueplace
 
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 687
Enviar un mensaje por Skype™ a enriqueplace
Re: $PHP->Orientado_a_objetos()

La diferencia entre agregación y composición es conceptual, no se diferencia por código.

Lo que es código se representa como la "agregación" de objetos por parte de un objeto único, por ejemplo: una clase Escuela "agrega" muchos Alumnos, lo que podría convertirse en un método "agregarAlumno" de la clase Escuela, donde lo único que hace es insertar el objeto dentro de una colección (array) de alumnos.

La composición se daría cuando la relación entre los dos tipos de objetos (Escuela, Alumno) es de "compuesto/componente" donde el componente no podría existir solo sin el compuesto.

Por ejemplo, en un contexto dado podría ser:
  • Un círculo se dibuja como muchos puntos uno a continuación del otro, pero los puntos en nuestro contexto no pueden existir de forma aislada. Existe entonces una relación de composición entre Círculo y Puntos ("el círculo agrega muchos puntos").
  • Una clase Banco que contiene muchos clientes y a su vez cada cliente contiene muchas cuentas. Se puede decir que hay una "relación de vida" entre Banco - Cliente y Cliente - Cuentas, donde los clientes no pueden estar "sueltos" en nuestro sistema sin estar asociados al Banco, de la misma forma no pueden existir Cuentas que no estén asociadas a un Cliente.

Me encontraste con ganas de escribir, pero te recuerdo que estos temas son elementales y se encuentra perfectamente la explicación conceptual de cada caso.
__________________
Saludos, Enrique Place

Blog:
PHPSenior - "Como convertirse en un Desarrollador PHP Senior y no morir en el intento..."
enriqueplace está desconectado   Responder Citando
Antiguo 30-mar-2007, 20:04   #3 (permalink)
guarus ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
De acuerdo Re: $PHP->Orientado_a_objetos()

Muchas gracias por tu pronta respuesta Enrique Place, pero es algo confuso, por lo menos para mi que estoy comenzando con POO en php, y como dices, se consigue teoria en internet, mas no ejemplos que tambien queria ver, pero me distes una idea.
Gracias nuevamente, y si puedes darme un ejemplo con codigo de agregacion te lo agradeceria igualmente.
guarus está desconectado   Responder Citando
Antiguo 31-mar-2007, 06:39   #4 (permalink)
Colaborador
enriqueplace tiene algunos puntos positivos de karma
 
Avatar de enriqueplace
 
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 687
Enviar un mensaje por Skype™ a enriqueplace
Re: $PHP->Orientado_a_objetos()

Estimado: si te digo que es conceptual y no se diferencia por código... qué código quieres que te escriba?

Es tan simple como que en la clase Escuela crear un atributo colAlumnos (colección de alumnos, o el nombre que más te guste) que sea un array, luego, crear un método addAlumno donde recibes objetos de tipo Alumno y los agregas dentro del array con algo como:

Código PHP:
class Escuela{
   private 
$colAlumnos;

   public function 
addAlumno(Alumno $unAlumno){
      
$this->colAlumnos[] = $unAlumno;
   }

Si esto es agregación... ¿como es entonces una "composición"?

Cambia el contexto a uno en el que el componente no puede existir sin el compuesto, cambias los nombre, y el código es el mismo (Círculo y puntos).

Si quisiéramos ser puros con los diagramas UML que representan esta "semántica" (solo es eso, un problema de semántica que no tienen correlación con nuestros lenguajes de programación) deberíamos destruir al "objeto componente" (los puntos) una vez que se desasocian del "objeto compuesto" (el círculo) o algo por el estilo (existir un procedimiento que destruya el objeto que se detecte como desasociado a su "objeto compuesto").

En Java y en PHP no se puede hacer o directamente no tiene sentido hacer tal representación en código.

¿Tu dirás, para que existe el concepto y la representación en UML?

Bueno, para eso, para documentar una situación que no es necesariamente igual a la otra, que puede interesarte especificar en el desarrollo de tu sistema, tal vez, con un lenguaje que sí pueda representarlo, o que a ti te representa algo en tu proceso de desarrollo.

Pero te comento que hay una tendencia a reducir la complejidad de los diagramas UML y ser mucho más sencillos, evitando este tipo de representación y simplificando solo con "agregación".
__________________
Saludos, Enrique Place

Blog:
PHPSenior - "Como convertirse en un Desarrollador PHP Senior y no morir en el intento..."
enriqueplace está desconectado   Responder Citando
Antiguo 31-mar-2007, 08:41   #5 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 773
Re: Como se implementa la agregacion y composicion en php

Me surgió una duda, con este buen topico:

Cuando tengo la siguiente situación podría ser considerada Composición?

Código PHP:
<?php
class Alumnos{
   private 
$nombre = array();
   public function 
setNombre($nombre){
      
$this->nombre[] = $nombre;
   }
   public function 
getNombre(){
      return 
$this->nombre;
   }
}

class 
Escuela{

   public function 
Alumnos(){
      return new 
Alumnos;
   }

}

$escuela = new Escuela;
$alumnos $escuela->Alumnos();
$alumnos->setNombre('pepito');
$alumnos->setNombre('juanito');
$alumnos->setNombre('otro');

foreach (
$alumnos->getNombre() as $a) {
    print 
"{$a}<br />\n";
}
?>
zsamer está desconectado   Responder Citando
Antiguo 31-mar-2007, 12:47   #6 (permalink)
DarioDario está en el buen camino
 
Avatar de DarioDario
 
Fecha de Ingreso: junio-2005
Ubicación: Burzaco, Bs. As. Argentin
Mensajes: 981
Re: Como se implementa la agregacion y composicion en php

Cita:
Iniciado por zsamer Ver Mensaje
Me surgió una duda, con este buen topico:

Cuando tengo la siguiente situación podría ser considerada Composición?
Si yo no entiendo mal ésta no sería Composición... mas bien diría que tienen una relación de uso (que se representa con la linea puntuada).
Código:
Escuela    - - - - - - - - - - - - - - - >  Alumnos
Según lo que tengo entendido sobre Agregación es que la vida del objeto "Agregado" es independiente del "Agregador"... en cambio cuando es de Composición el tiempo de vida del primero muere con el segundo, se entiende?

Con código debería ser algo así (ejemplo sacados de esta pagina):

Agregación:
Código PHP:
<?php
class Dao {
    function 
getSomething() {
 
    }
}
 
class 
Model {
    var 
$dao;
    function 
Model (& $dao) {
        
$this->dao=& $dao;
    }
 
    function 
doSomething () {
        
$this->dao->getSomething();
    }
}
 
$dao=new Dao;
 
$model=new Model($dao);
$model->doSomething();
Composición:
Código PHP:
<?php
class LinkWidget {
 
}
 
class 
View {
    var 
$linkWidget;
    var 
$page;
    function 
View () {
        
$this->linkWidget=new LinkWidget;
    }
 
    function 
renderPage () {
        
$this->page=$this->linkWidget->display()
    }
}
?>
Saludos.
DarioDario está desconectado   Responder Citando
Antiguo 01-abr-2007, 09:44   #7 (permalink)
Colaborador
enriqueplace tiene algunos puntos positivos de karma
 
Avatar de enriqueplace
 
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 687
Enviar un mensaje por Skype™ a enriqueplace
Re: Como se implementa la agregacion y composicion en php

En mi opinión diría que no tienes ninguna de las dos cosas y que el ejemplo tiene un problema de conceptos.

Algunos puntos:
  • La clase Alumnos no tiene mucho sentido, lo que deberías crear como objeto sería un Alumno
  • La Escuela debería contener los alumnos, por lo tanto debería ser un atributo de la misma el contenedor de Alumnos
  • La clase Alumnos genera conceptualmente un "contenedor de Alumnos " el cual no guarda objetos sino nombres de alumnos... sueltos.
  • ¿La clase Escuela solo tiene por función crear un objeto Alumnos? ¿Que sentido tendría? Debería ser algo interno de la clase Escuela contener los alumnos.

Si fueras un alumno novato te diría que estás entendiendo mal el uso de los objetos y que no les estás sacando provecho
__________________
Saludos, Enrique Place

Blog:
PHPSenior - "Como convertirse en un Desarrollador PHP Senior y no morir en el intento..."
enriqueplace está desconectado   Responder Citando
Antiguo 01-abr-2007, 11:00   #8 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 773
Re: Como se implementa la agregacion y composicion en php

Gracias por las correcciones, estoy completamente de acuerdo, antes de publicar el tema pensé en escribir que "no tomaran en cuenta la lógica del ejemplo ya que no la tiene", bueno, pero no lo hice, no se me ocurrió otro ejemplo, lo hice para mostrar mi duda, a que concepto corresponde cuando una clase crea a otra y la retorna.

bueno quizás un ejemplo de mi duda anterior, que tenga sentido podría ser:

Código PHP:
class Page {
    private 
$title;
    private 
$html;
    public function 
__construct($title='Default Page'){
        
$this->title=$title;
        
$this->html='';
    }
    public function 
makeHeader($header){
        
$this->html.='<html><head><title>'.
         
$this->title.'</title></head><body>'.$header;
    }
    public function 
makeBody($content=array()){
        return new 
Table($this,$content);
    }
    public function 
makeFooter($footer){
        
$this->html.=$footer.'</body></html>';
    }
    public function 
display(){
        return 
$this->html;
    }
}


class 
Table {
    private 
$page;
    private 
$content;
    private 
$id;
    public function 
__construct(&$page,$content){
        
$this->page=&$page;
        
$this->content=$content;
        
$this->id='defaultID';
    }
    public function 
setId($id){
        
$this->id=$id;
    }
    public function 
build($colorA,$colorB){
        
$this->page->html.='<table id="'.$this->id.'" width="100%">';
        
$i=0;
        foreach(
$this->content as $row){
            
$bgcolor=($i%2)?$colorA:$colorB;
            
$this->page->html.='<tr bgcolor="'.$bgcolor.'">
             <td>'
.$row.'</td></tr>';
            
$i++;
        }
        
$this->page->html.='</table>';
        return 
$this->page->html;
    }
}


$page=new Page();
$page->makeHeader('<div>Header</div>');

$table=$page->makeBody(range(0,20));
$table->setId('maincontent');
$table->build('#ffcc00','#eeeeee');

$page->makeFooter('<div>Footer</div>');
echo 
$page->display(); 
Bueno espero comentarios si este ejemplo tiene algo o nada de composición.


PD: Aun sigo siendo novato, solo llevo algunos meses en oop.

Última edición por zsamer; 01-abr-2007 a las 11:28.
zsamer está desconectado   Responder Citando
Antiguo 01-abr-2007, 11:38   #9 (permalink)
guarus ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
Parpadear Re: Como se implementa la agregacion y composicion en php

Amigo enriqueplace, muchas gracias por responderme, en verdad solo queria ver parte de codigo para comprender mejor de la teoria, ya que soy novato en este tema y bueno la explicacion no me servia de mucho para comprender.
Gracias tambien a DarioDario y a zsamer por sus ejemplos, eso es lo que en verdad buscaba para comprender.
Saludos, seguire estando aqui para consultar otro duda
guarus está desconectado   Responder Citando
Antiguo 01-abr-2007, 11:54   #10 (permalink)
DarioDario está en el buen camino
 
Avatar de DarioDario
 
Fecha de Ingreso: junio-2005
Ubicación: Burzaco, Bs. As. Argentin
Mensajes: 981
Re: Como se implementa la agregacion y composicion en php

zsamer yo creo que no tiene nada de Composición. Según lo que entiendo la relación de Composición se resume en la siguiente frase:
Código:
El tiempo de vida del objeto incluido esta condicionado por el tiempo de vida del que lo incluye.
En el ejemplo que vos mostras si nos situamos antes del echo y destruimos la variable $page (que es una instancia de la clase Page) la variable $table no muere y directamente no "siente" nada. En teoría si muere el que incluye debería morir el incluido (En esta caso si muere Page, debería morir Table).

Ahora que me fijo mejor en el ejemplo que mostrar ni siquiera Page incluye a Table, lo único que hace es crearlo y devolverlo (no lo almacena) osea que en éste ejemplo la relación es de uso (linea punteada).

Hice el siguiente código a ver si se entiende lo que yo entiendo por Composición:

Código PHP:
class Cuenta{
        private 
$numero '';

        public function 
__construct($numero){
                
$this->numero $numero;
        }

        public function 
getNumero(){ return $this->numero; }
}

class 
Banco{
        private 
$nombre '';
        private 
$direccion '';
        private 
$cuentas = array();

        public function 
__construct($nombre,$direccion){
                
$this->nombre $nombre;
                
$this->direccion $direccion;
        }

        public function 
agregarCuenta($numeroDeCuenta){
                
$this->cuentas[] = new Cuenta($numeroDeCuenta);
        }
}

$banco = new Banco('Nacion''Lejos de aca');
$banco->agregarCuenta(123);
$banco->agregarCuenta(1234);
$banco->agregarCuenta(12345); 
En este ejemplo si muere la instancia de Banco mueren todas las instancias de Cuenta que están almacenadas en Banco.

Saludos.
DarioDario está desconectado   Responder Citando
Antiguo 01-abr-2007, 14:48   #11 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 773
Re: Como se implementa la agregacion y composicion en php

Dario, comparto tu opinión y es lo que yo entendía sobre el "concepto de composición", hasta que me topé con este articulo Introduction to Composition, y despues de leerlo quedé con una gran duda sobre el "concepto de Composición", por eso es que aproveché este tópico para plantear y mostrar lo que presenta el articulo que leí sobre el tema.

Saludos.
zsamer está desconectado   Responder Citando
Antiguo 01-abr-2007, 16:45   #12 (permalink)
DarioDario está en el buen camino
 
Avatar de DarioDario
 
Fecha de Ingreso: junio-2005
Ubicación: Burzaco, Bs. As. Argentin
Mensajes: 981
Re: Como se implementa la agregacion y composicion en php

Cita:
Iniciado por zsamer Ver Mensaje
Dario, comparto tu opinión y es lo que yo entendía sobre el "concepto de composición", hasta que me topé con este articulo Introduction to Composition, y despues de leerlo quedé con una gran duda sobre el "concepto de Composición", por eso es que aproveché este tópico para plantear y mostrar lo que presenta el articulo que leí sobre el tema.

Saludos.
Osea que compartimos la misma opinión sobre la Composición?

Ahora leí el articulo (por arriba, me mareo con textos tan largos) y en la primera frase ya me encuentro con esto:
Código:
It occurs when an object creates another object; that is, the first object completely possesses the second object.
Traducido sería algo así (no me llevo muy bien con el ingles):
Código:
Esto ocurre (N.T: la Composición) cuando un objeto crea otro; es decir, el primer objeto posee completamente al segundo objeto.
Y con lo anterior terminamos en el mismo concepto... el objeto "principal" debe almacenar al otro objeto con lo cual, sí muere el primero muere el segundo.

Ahora yo creo que ese ejemplo no tiene ni pies ni cabeza con el tema de Composición, tal vez hay un algo conceptual que no entiendo en el articulo por lo que no lo entiendo... pero para mí no esta bien ese ejemplo. Y si lo pienso un poco no sería raro que este mal el articulo (obviamente lo tiene que leer alguien que sepa más que yo y que entienda bien el ingles y opine lo mismo que yo), cuanta mala información hay un internet? y cuando desactualizada? Entonces no sería muy raro que esto este mal.

De todas maneras espero que alguien con más experiencia opine, pero mi conclusión es la que dije

Saludos.
DarioDario está desconectado   Responder Citando
Antiguo 02-abr-2007, 22:10   #13 (permalink)
DarioDario está en el buen camino
 
Avatar de DarioDario
 
Fecha de Ingreso: junio-2005
Ubicación: Burzaco, Bs. As. Argentin
Mensajes: 981
Re: Como se implementa la agregacion y composicion en php

He publicado un post en mi blog sobre este tema, si a alguien le interesa aquí esta mi blog.

Saludos.
DarioDario está desconectado   Responder Citando
Antiguo 04-abr-2007, 07:36   #14 (permalink)
guarus ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
Re: Como se implementa la agregacion y composicion en php

Hola nuevamente, continuando con la agregacion, tengo lo siguiente:

Una clase llamada Proyecto que contiene 2 atributos:$idproyecto y $descripcion y sus respectivos gets y sets unicamente. Seguidamente tengo otra clase llamada JefeProyecto que contiene 2 atributos igualmente: $idjefeproyecto y el otro $proyectos que es donde deseo guardar los objetos de la clase proyecto, en esta clase tengo el get y set de $idjefeproyecto y tengo una funcion llamada agregarproyecto con lo siguinte

public function agregarproyectos($unproyecto)
{
$this->proyectos[] = $unproyecto;
}

Mi pregunta es ¿Una vez que creo el objeto $jp, que es de tipo JefeProyecto, y creo tambien 3 objetos de tipo Proyecto y les agrego a cada uno de estos sus id y descripcion, los agrego al atributo $proyectos de $jp atraves de la funcion anteiormente mostrada. Hecho esto, Como hago para acceder a cada uno de estos objetos, desde $jp, y mostrar sus respectivos datos?

Me gustaria que me explicaran mediante codigo, con los datos que les describe anteriormente. Gracias

Lo tengo de esta forma y me da error


$jp = new JefeProyecto();
$p = new Proyecto();

$p->setID('01');
$p->setDescripcion('POO');

$jp->setIDProyecto('01');
$jp->agregarproyectos(p);

echo $jp->proyectos->getDescripcion() //error en el acceso
guarus está desconectado   Responder Citando
Antiguo 04-abr-2007, 08:07   #15 (permalink)
Moderador
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: Queretaro, Mexico
Mensajes: 12.597
Re: Como se implementa la agregacion y composicion en php

Tendrias que implementar alguna funcion que te regrese el index de un proyecto, o en su caso todos los proyectos y hacer un loop:

Código PHP:
echo $jp->getProyecto(1)->getDescripcion(); 
GatorV está desconectado   Responder Citando
Antiguo 04-abr-2007, 14:29   #16 (permalink)
guarus ha deshabilitado el karma
 
Fecha de Ingreso: agosto-2006
Mensajes: 13
Re: Como se implementa la agregacion y composicion en php

gracias GatorV por tu respuesta, pero si podrias decirme con codigo lo que me explicastes te lo agradeceria, lo que pasa es que soy novato en este tema y no entiendo bien.
guarus está desconectado   Responder Citando
Antiguo 04-abr-2007, 15:45   #17 (permalink)
Moderador
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: Queretaro, Mexico
Mensajes: 12.597
Re: Como se implementa la agregacion y composicion en php

Código PHP:
class JefeProyecto {
     private 
$proyectos = array();

     public 
funcion getProyecto($index) {
           return 
$proyectos[$index];
     }

Obvio necesitas hacer chequeos para que no sea un index fuera de la lista o no numerico, etc.
GatorV está desconectado   Responder Citando