Foros del Web » Programando para Internet » PHP »

Asignar un objeto como propiedad de la clase de otro objeto

Estas en el tema de Asignar un objeto como propiedad de la clase de otro objeto en el foro de PHP en Foros del Web. Bueno tengo un sistema que contiene equipos y empleados, es todo con programacion orientada a objetos. Tengo en la base de datos los empleados, y ...
  #1 (permalink)  
Antiguo 02/01/2014, 13:57
Avatar de giuli956  
Fecha de Ingreso: noviembre-2012
Mensajes: 149
Antigüedad: 11 años, 5 meses
Puntos: 1
Asignar un objeto como propiedad de la clase de otro objeto

Bueno tengo un sistema que contiene equipos y empleados, es todo con programacion orientada a objetos.
Tengo en la base de datos los empleados, y en la tabla equipos el idempleado, para hacer una relacion.

entonces en el ejercicio que me dieron me piden, ademas de los atributos de equipos, cuando programe la clase de equipo que incluya un objeto de tipo empleado, para poder hacer la relacion. Mas precisamente dice:
Crear un script para la clase Equipo dentro de la carpeta /sge/equipo/includes/. La clase debe
contener los atributos privados para el id de equipo, descripción, dirección de IP, dirección de MAC
y uno el cual debe contener un objeto del tipo Empleado, y los métodos getter y setter para cadauno
de los atributos, el método setter para empleado debe recibir un objeto del tipo Empleado como
parámetro.

Lo que hice fue (que no funciona obviamente):

Código PHP:
Ver original
  1. <?php
  2.  
  3. class equipo{
  4.     private $_idEquipo;
  5.     private $_descripcion;
  6.     private $_dirip;
  7.     private $_dirmac;
  8.     private $_empleado;
  9.    
  10.     public function getIdEquipo(){
  11.         return $this->_idEquipo;
  12.     }
  13.     public function getDescripcion(){
  14.         return $this->_descripcion;
  15.     }
  16.     public function getDirip(){
  17.         return $this->_dirip;
  18.     }
  19.     public function getDirmac(){
  20.         return $this->_dirmac;
  21.     }
  22.     public function getEmpleado(){
  23.         return $this->_empleado;
  24.     }
  25.     public function setIdEquipo($idEquipo){
  26.         $this->_idEquipo=$idEquipo;
  27.     }
  28.     public function setDescripcion($Descripcion){
  29.         $this->_descripcion=$Descripcion;
  30.     }
  31.     public function setDirip($Dirip){
  32.         $this->_dirip=$Dirip;
  33.     }
  34.     public function setDirmac($Dirmac){
  35.         $this->_dirmac=$Dirmac;
  36.     }
  37.     public function setEmpleado($empleado){
  38.         $this->_empleado=new empleado();
  39.        
  40.     }
  41.     public function getAll(){
  42.         $SQL="select * from equipo";
  43.         $bd=new BaseDeDatos();
  44.         $result=mysql_query($SQL);
  45.         if(!$result) {
  46.             die('No se ha podido ejecutar la consulta');
  47.         }
  48.         $aItems=array();
  49.         // Buscamos todas las filas afectadas (Todos los empleados encotnrados)
  50.        
  51.         while($row = mysql_fetch_object($result))
  52.         {
  53.             $e=new equipo();
  54.             $e->setIdEquipo($row->idequipo);
  55.             $e->setDescripcion($row->descripcion);
  56.             $e->setDirip($row->ip);
  57.             $e->setDirmac($row->mac);
  58.             $e->setEmpleado($row->idempleado);
  59.             $aItems[] = $e;
  60.     }
  61.     return $aItems;
  62.     }
  63. }
  64.  
  65. ?>
Todos los atributos los muestra bien, me falta el tema del objeto, nunca pen se que se podia asignar un objeto como atributo de otro.
Les agradezco su ayuda.
  #2 (permalink)  
Antiguo 02/01/2014, 14:10
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Asignar un objeto como propiedad de la clase de otro objeto

Bueno todo iba bien hasta que vi el método getAll(), con todo respeto eso haría llorar a cualquier programador de POO, aparentemente estas empezando pero pues que eso te quede de lección

getAll debería hacerse bajo la misma ideología de POO (cosa que no es así) delegando la conexión y las funciones del CRUD a una clase aparte. Además de que ya no debes de usar las funciones de mysql_* debes de usar mysqli_* en modo de objetos o PDO

Cuando habla de que setEmpleado recibe un parámetro de tipo Empleado es que ese método debería ir algo así:

Código PHP:
Ver original
  1. public function setEmpleado(Empleado $empleado){
  2.     $this->_empleado = $empleado;
  3. }

Donde $empleado hace referencia a una instancia de la clase Empleado

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 02/01/2014, 15:39
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Asignar un objeto como propiedad de la clase de otro objeto

Todo iba bien hasta getAll()?
Aparte de lo que dice @jonni09lo, hay unas cuantas cosas de OOP pura que hay que tener en cuenta, y que busco cuando reviso codigo de objetos con persistencia en DB.
- Todos los metodos de instancia, deben ser de instancia?
El metodo getAll() es un metodo de instancia.Es necesaria una instancia para poder llamarlo.Y aqui ya salen 2 problemas.El primero, que ese metodo no es de una instancia.Un metodo de instancia devuelve cosas relacionadas con la instancia (un equipo en concreto).Y getAll no lo cumple.Devuelve otros equipos.Es un metodo de creacion de instancias.Similar problema ocurrira cuando crees getEquipoByEmpleado, etc, etc.

Para poder crear un equipo dadas unas condiciones, necesitas otro equipo.Y (este es el segundo problema), muy posiblemente, para crear el primer equipo, necesites un id (suele ocurrir).
La solución "barata", aunque discutible desde el punto de vista de la OOP es convertir el metodo de instancia, en metodo de clase (estático).La solución más laboriosa es crear una clase Factoría asociada.

- Qué son las relaciones?
Ya que es un objeto mapeado a una BD, es posible que tenga relaciones como variables miembro de la clase.Qué son esas variables miembro? Almacenan el valor del campo relación, o una instancia del objeto relacionado? Si yo hago getEmpleado, que recibo? un id, o una instancia de empleado? Si yo hago setEmpleado, qué espera? Un id, o una instancia de la clase Empleado?
En tu código, mezclas las dos cosas.
En el método getAll(), se llama a setEmpleado pasando un id. Lo interesante es que setEmpleado no hace nada con ese id(que jonny09lo, en cuanto vió lo de la BD, fue a morder ahí, y se le pasó ), por lo que el método está mal.Pero lo que parece es que la variable miembro privada _empleado, debe almacenar una instancia.Por lo quet getEmpleado retorna una instancia.
Así tenemos setEmpleado que recibe un id, y getEmpleado, que retorna una instancia.

- Cómo se gestiona si un objeto ya ha sido cargado de la BD?
En el caso de que el id sea requerido en el constructor, se supone que el objeto se va a obtener de la BD inmediatamente.Hay que tener en cuenta que un constructor no devuelve errores.Si el objeto no existiese, habría que gestionarlo usando excepciones o métodos de tipo "isLoaded()".
Pero, si el id no es requerido en el constructor, están todos los métodos protegidos por posibles accesos *antes* de que el objeto se cargue?
Tiene sentido crear un objeto equipo, y, sin cargarlo, pedirle el empleado? Cómo reacciona la clase en ese caso?

- En caso de que los métodos get... y set... de relaciones, usen instancias, cuándo son creadas? (lazy-loading)
Si inmediatamente, cuando creas una instancia y cargas datos de la BD, inicializas las variables miembro que modelan relaciones, en instancias de esas clases..Es lógico que éstas hagan lo mismo a su vez...Y generen otras instancias, las cuales generan otras..
Y, posiblemente, todas cargandose de base de datos...

- Qué devuelven los métodos que retornan múltiples datos?
Devuelven *siempre* instancias, o *siempre* filas? Es una versión del problema del Get y Set.Cuidado con devolver siempre instancias.Y es el mismo problema que el anterior, multiplicado por el número de filas que obtengas.

Aparte hay otras consideraciones, sobre todo de rendimiento.
Pero, dejo una coña más, que siempre me ha llamado la atención:
- Teóricamente, un objeto de una clase *nunca* debería poder obtener datos de otra.Es decir, cualquier clase construida como un mapeo de una tabla, jamás podría hacer una query con un JOIN.Eso significaría que esa clase conoce lo que son variables miembro de otra clase, podría cambiar valores,etc.Y eso está prohibido en OOP.
Es uno de los problemas de la OOP con respecto a lo *relacional*.No son lo mismo, por mucho ORM y mapeos que hagamos.

Última edición por dashtrash; 02/01/2014 a las 16:01
  #4 (permalink)  
Antiguo 02/01/2014, 16:16
Avatar de giuli956  
Fecha de Ingreso: noviembre-2012
Mensajes: 149
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: Asignar un objeto como propiedad de la clase de otro objeto

-Gracias por responder.

El metodo getAll devuelve todos los equipos, por lo que no es de instancia, pero no se como harian uds. para devolver todos los equipos de la base de datos, y en ningun momento estoy instanciando un equipo en particular.
  #5 (permalink)  
Antiguo 02/01/2014, 16:32
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Asignar un objeto como propiedad de la clase de otro objeto

Como te decía, lo facil es simplemente declararlo estático (static function getAll()..) y llamarlo como equipo::getAll()
Has visto ya que no cumples lo que se te pide, ya que setEmpleado lo estás inicializando con un id (aunque no lo uses), en vez de con una instancia? La instancia la tendrías que crear en getAll().
Y, una cosa que no comenté antes: decídete: español o inglés!! "getEmpleado"? .
  #6 (permalink)  
Antiguo 04/01/2014, 23:58
Avatar de giuli956  
Fecha de Ingreso: noviembre-2012
Mensajes: 149
Antigüedad: 11 años, 5 meses
Puntos: 1
Respuesta: Asignar un objeto como propiedad de la clase de otro objeto

Bueno la verdad en el colegio me lo han dado asi, ya que yo solo tengo que desrrollar el script de equipos y el de empleados, el resto me los dan, y llama a getAll con una flecha en vez de usar el operador de resolucion de ambito. Jeje, pero igual me quedo:

Código PHP:
Ver original
  1. public function setEmpleado(empleado $empleado){
  2.         $this->_empleado=new empleado();
  3.        
  4.     }

Bueno la pagina funciona y no me da errores, pero en la tabla en el lugar de empleados aparece ", (L )", y no se que sera


Y entonces como deberia hacer en getAll para obtener el empleado correspondiente al equipo y mostrarlo en la tabla?

Y despues necesito ayuda con las funciones buscar() y modificar(), ya lñas programe pero tengo el problema del objeto empleado.

Última edición por giuli956; 05/01/2014 a las 00:36

Etiquetas: clase, mysql, objeto, propiedad, select, sql, tabla
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 00:33.