Ver Mensaje Individual
  #5 (permalink)  
Antiguo 06/05/2017, 17:48
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Consejo en uso de Classes, por favor.

Código PHP:
class Auto {
  public 
$TanqueGasolina = new TanqueGasolina();
  public 
$Motor = new Motor();

  
// Funciones del Auto

El primer problema que tienes es que la clase carro crea las instancias de tanque y motor esto genera un poco de acoplamiento para ciertos casos.
Código PHP:
class TanqueGasolina extends Auto {
  public 
$Gasolina 100;

  
// Funciones del Tanque de gas
}

class 
Motor extends Auto {
  public 
$Estado "Apagado";
  
  public function 
Encender() {
    
// AQUI EMPIEZAN MIS DUDAS
  

El problema en esta parte es que estas intentando usar la herencia como forma de reutilización en clases que no tiene nada en común, a esto se le conoce como Refused bequest para resolver esto puedes usar composición o delegar la responsabilidad en otras clases. Por otro lado, algo que pasaste por alto es que estas explicando el problema que tienes pero no lo que realmente quieres hacer, pero con la información que proporcionaste y viendo el código puedes hacer algo como lo siguiente.
Código PHP:
Ver original
  1. class Tank {
  2.    
  3.     private $level = 0;
  4.    
  5.     public function level() {
  6.         return $this->level;
  7.     }
  8.    
  9.     public function fill($quantity) {
  10.         $this->level = $quantity;
  11.     }
  12. }
  13.  
  14. class Engine {
  15.    
  16.     private $state = 'off';
  17.    
  18.     private $tanke = null;
  19.    
  20.     public function __construct(Tank $tank) {
  21.         $this->tank = $tank;
  22.     }
  23.    
  24.     public function turnOn() {
  25.        
  26.         if ($this->tank->level()) {
  27.             $this->state = 'on';
  28.         } else {
  29.             $this->state = 'off';
  30.         }
  31.        
  32.         return $this->state;
  33.     }
  34.    
  35.     public function turnOff() {
  36.         $this->state = 'off';
  37.     }
  38.    
  39. }
  40.  
  41. class Car {
  42.    
  43.     private $tank;
  44.    
  45.     private $engine;
  46.    
  47.     public function __construct(Tank $tank, Engine $engine) {
  48.         $this->tank = $tank;
  49.         $this->engine = $engine;
  50.     }
  51.    
  52.     public function turnOn() {
  53.         return $this->engine->turnOn();
  54.     }
  55.    
  56.     public function turnOff() {
  57.         return $this->engine->turnOff();
  58.     }
  59.    
  60.     public function fillGas($quantity) {
  61.         $this->tank->fill($quantity);
  62.     }
  63.    
  64. }
  65. //ejemplo
  66. $tank = new Tank();
  67. $tank->fill(100);
  68. $engine = new Engine($tank);
  69. $car = new Car($tank, $engine);
  70. var_dump($car->turnOn());
  71. $car->turnOff();
  72. $car->fillGas(0);
  73. var_dump($car->turnOn());
Este ejemplo tiene mucho que mejorar pero la idea de utiliza delegación te simplifica el problema y obtienes un api mas sencilla de usar ademas cada objeto ya tiene su propia responsabilidad.
Si estas comenzando con la POO te aconsejo que leas sobre los principios GRASP para que aprendas como signar responsabilidades entre clases, un buen libro que habla sobre el tema es el de craig larman
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Última edición por hhs; 06/05/2017 a las 18:40 Razón: agregue referencia