2015-02-06 46 views
-2

我有这些相关的类:指定子类中的变量父

class cars { 

    public $cars; 

    public function addCar($name, $car) 
    { 
     $this->cars[$name] = $car; 
    } 

    public function getCars() 
    { 
     return $this->cars; 
    } 

    public function getCar($name) 
    { 
     return $this->cars[$name]; 
    } 

    public function getParams() 
    { 
     return $this->params; 
    } 
} 

$cars = new cars(); 

class bmw extends cars { 

    private static $_instance = null; 
    protected $params; 

    function __construct() 
    { 
     $this->params['param'] = 'foo'; 
    } 

    public static function init() 
    { 
     if (self::$_instance === null) { 
      self::$_instance = new self; 
     } 

     return self::$_instance; 
    } 
} 

$cars->addCar('bmw', bmw::init()); 

基本上我需要从父类访问所有子类。并使用父类中定义的方法定义这些子类。添加新的子类时不应修改父类。

到底这应该是这样的:

foreach($cars->getCars() as $car) 
{ 
    foreach($car->getParams() as $key => $param) 
     echo "$key = $param"; 
} 

什么是做到这一点的正确方法?

+0

'基本上我需要从父class'访问所有子类,所以你想重塑OOP?这是非常令人难以置信的:-) – Alex 2015-02-06 14:13:57

+0

有一些真正奇怪的事情。 “Cars”是一个数组,但扩展它的“bmw”是一个单独的实例。这是不是很清楚你在这里做什么。 – Erik 2015-02-06 14:13:58

+0

我想要在var中获取所有类汽车的子实例,然后使用在这些实例中的汽车类中定义的方法。 – code9 2015-02-06 14:21:52

回答

2

提供帮助确实很困难,因为它不太清楚你想要达到的目标。

在我看来,你需要注册表类(carDealer),这是一个抽象类,具有共同的(对于每个孩子)方法和一个孩子(Bmw)。

所以,像这样:

// You seems to need what is called sometimes a Registry. 
// Something which deal with keeping and delivering a group of 'related' classes, as a register. 
class CarsDealer 
{ 
    public $cars; 

    public function addCar($name, $car) 
    { 
     $this->cars[$name] = $car; 
    } 

    public function getCars() 
    { 
     return $this->cars; 
    } 

    public function getCar($name) 
    { 
     return $this->cars[$name]; 
    } 
} 

// then you need a basic contract for each concrete classes 
// that will have the same nature and so will extend it 
abstract class Car 
{ 
    protected $params; 

    public function getParams() 
    { 
     return $this->params; 
    } 
} 

// finally the concrete class 
class Bmw extends Car 
{ 
    public function __construct($params = null) 
    { 
     $this->params['param'] = $params; 
    } 
} 

$carsDealer = new CarsDealer(); 

$carsDealer->addCar('bmw', new Bmw('foo')); 

foreach ($carsDealer->getCars() as $car) 
{ 
    foreach ($car->getParams() as $key => $param) { 
     echo "$key = $param"; 
    } 
} 

请注意一些基本规则/良好做法/惯例:

+0

我应该为此使用注册表。感谢您的帮助。 – code9 2015-02-06 14:54:25

0

只是一个另一种方法,如果你只需要得到这个 'PARAMS' :-)

class cars { 

    public $cars; 

    public function addCar($name, $car) 
    { 
     $this->cars[$name] = $car; 
    } 

    public function getCars() 
    { 
     return $this->cars; 
    } 

    public function getCar($name) 
    { 
     return $this->cars[$name]; 
    } 

    public function getParams($obj) 
    { 
     return $obj->params; 
    } 


} 

$cars = new cars(); 

class bmw extends cars { 

    private static $_instance = null; 
    protected $params; 

    function __construct() 
    { 
     $this->params['param'] = 'foo'; 
    } 

    public static function init() 
    { 
     if (self::$_instance === null) { 
      self::$_instance = new self; 
     } 

     return self::$_instance; 
    } 
} 

$cars->addCar('bmw', bmw::init()); 

print_r($cars->getParams($cars->getCar('bmw')));