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

¿Cómo implementarlo?

Estas en el tema de ¿Cómo implementarlo? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, Verán tengo el siguiente caso que resulta que no sé cómo implementarlo correctamente. No sé de que manera o qué habría que usar. Les ...
  #1 (permalink)  
Antiguo 24/07/2012, 04:29
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 17 años, 6 meses
Puntos: 74
¿Cómo implementarlo?

Buenas,
Verán tengo el siguiente caso que resulta que no sé cómo implementarlo correctamente. No sé de que manera o qué habría que usar.

Les comento, tengo 5 clases, las cuales son las siguientes:

Base.php

Código PHP:
Ver original
  1. class Base
  2. {
  3.     //propiedades
  4.    
  5.     //métodos
  6.    
  7.     public function __construct()
  8.     {
  9.         foreach ($this->importar_clases as $clase):
  10.             $this->$clase = new $clase;
  11.         endforeach;
  12.     }
  13. }

ConfigBase.php

Código PHP:
Ver original
  1. class ConfigBase extends Base
  2. {
  3.     public $color = 'blanco';
  4. }

A.php

Código PHP:
Ver original
  1. class A extends ConfigBase
  2. {
  3.     public $color = 'azul';
  4.     public $importar_clases = array('B', 'C');
  5.    
  6.     public function metodoDeA()
  7.     {
  8.         return $this->B->metodoDeB();
  9.     }
  10. }

B.php

Código PHP:
Ver original
  1. class B extends ConfigBase
  2. {
  3.     public $color = 'rojo';
  4.    
  5.     public function metodoDeB()
  6.     {
  7.         //código
  8.     }
  9.  
  10. }

C.php

Código PHP:
Ver original
  1. class C extends ConfigBase
  2. {
  3.     //No específico ningún color y recoje el color de ConfigBase
  4.    
  5.     public function metodoDeC()
  6.     {
  7.         //código
  8.     }
  9. }

Cómo véis, todas heredan de ConfigBase que ésta, a su vez hereda de Base.
Se específica un color para cada clase y aquellas que no tengan ningúno cojen el color de ConfigBase que es blanco.
Bueno, el problema al que me enfrento es, ¿como incluir la clase B y C en la clase A?
Si se fijan en la propiedad "importar_clases" trato de incluir esas clases en A para poder utilizarlas en dicha clase.
Luego, la clase Base es quién importa esas clases.

En fin, como véis es una autentica chapuza por eso me gustaría saber como resolver esto o de que manera sería mejor implementar este sistema.

Gracias por cualquier manita que me podías echar ;)

Saludos
  #2 (permalink)  
Antiguo 24/07/2012, 06:25
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: ¿Cómo implementarlo?

Yo te recomiendo que investigue sobre patrones de diseño, realmente no se que es lo que quieres hacer.

Por un lado intentas instanciar las clases en una variable $clase que nadie tiene, cuando debería ser a lo sumo un array contenedor

Además desde clase A tratas de llamar a un método de clase B haciendo referencia a una propiedad B que nadie tiene, cuando debería provenir del array contenedor, y para ello pudiendo usar los métodos mágicos como __call o __get
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 24/07/2012, 06:44
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 17 años, 6 meses
Puntos: 74
Respuesta: ¿Cómo implementarlo?

Los únicos patrones que conozco son singleton, registry y el factory, o sea, los fáciles ;)
Lo que quiero hacer es algo similar a lo que hace el framework CakePHP, que un controlador pueda incluir otros controladores a su vez, ¿sabes como digo?

Cita:
Por un lado intentas instanciar las clases en una variable $clase que nadie tiene, cuando debería ser a lo sumo un array contenedor

Además desde clase A tratas de llamar a un método de clase B haciendo referencia a una propiedad B que nadie tiene, cuando debería provenir del array contenedor, y para ello pudiendo usar los métodos mágicos como __call o __get
¡Aja! La verdad es que sé que es una autentica chapuza, por eso vine pidiendo ayuda para como conseguir algo similar o por el estilo.

¿Podrías darme una mejor idea de como seria eso de un "array contenedor"? o ¿qué patrones de diseño en concreto seria conveniente mirar?

La verdad es que estoy totalmente perdido. Quiero hacer algo tipo a como hace Cake y no sé como debería de idearlo.

Muchas gracias,
  #4 (permalink)  
Antiguo 24/07/2012, 09:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: ¿Cómo implementarlo?

Cake no es lo mejor de replicar, lee sobre el principio de Liskov, no puedes heredar clases solo porque pienses que es la forma más fácil de importar el comportamiento de una clase en otra.

Un diseño solido es aquel que respeta los principios de la POO, que es el polimorfismo, de cada clase, y tiene un diseño consistente.

Si lo que quieres es usar métodos de la clase B en la clase A, simplemente importala a tu clase A, e instanciala dentro, y aún mejor usa DI para que B sea una dependencia inyectada a tu clase A, pero ahorita de entrada, si estas comenzando, empieza por el pie derecho.

Reglas generales, no hay una clase genérica sobre la cual heredes todo, eso es totalmente incorrecto y rompe con lo que debe de ser una herencia (la herencia solo se puede aplicar cuando hay una relación de familia).

Lee sobre el estándar PSR-0, y usa un autoloader, así te evitas estar haciendo "includes/requires" y solamente te enfocas realmente al diseño de tu sistema.

Saludos.
  #5 (permalink)  
Antiguo 27/07/2012, 09:33
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 17 años, 6 meses
Puntos: 74
Respuesta: ¿Cómo implementarlo?

Cita:
Cake no es lo mejor de replicar, lee sobre el principio de Liskov, no puedes heredar clases solo porque pienses que es la forma más fácil de importar el comportamiento de una clase en otra.
Gracias, ya tengo un par de artículos que hablan sobre el tema. Me voy a poner a leerlos

Cita:
Un diseño solido es aquel que respeta los principios de la POO, que es el polimorfismo, de cada clase, y tiene un diseño consistente.
Sí. Veo que me fui hacerlo de una manera totalmente incorrecta...

Cita:
Si lo que quieres es usar métodos de la clase B en la clase A, simplemente importala a tu clase A, e instanciala dentro, y aún mejor usa DI para que B sea una dependencia inyectada a tu clase A, pero ahorita de entrada, si estas comenzando, empieza por el pie derecho.
Investigando el patrón de diseño "dependency injection" entre otros...

Cita:
Reglas generales, no hay una clase genérica sobre la cual heredes todo, eso es totalmente incorrecto y rompe con lo que debe de ser una herencia (la herencia solo se puede aplicar cuando hay una relación de familia).
Sí, como dije... gran fallo el mío. Estaba haciendo justo eso. Quería que todo heredase de una clase en concreto.... OMG

Cita:
Lee sobre el estándar PSR-0, y usa un autoloader, así te evitas estar haciendo "includes/requires" y solamente te enfocas realmente al diseño de tu sistema.
Interesante

Cita:
Saludos.
Saludos,

Etiquetas: clase, class
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 17:33.