2016-10-29 49 views
2

我有什麼:PHP - 讓類對象作爲屬性另一類

$tom = new Driver; 
$bmw = new Car; 
$benz = new Car; 

我想擁有什麼:

foreach (Car::$all_cars as $car) { 
    $tom->setRating($car, $rating); // $rating comes from user input 
} 

問:

如何實施這個?

約束:

  • 車對象的數量是可變的和未知的(因此沒有靜態屬性在驅動程序類名)。
  • 每個車手對於車類中的每個物品都有評分
  • 評級屬性應在驅動程序類別中有意定義。

我想什麼:

Class Driver { 
    private $cars; 

    public function __construct() { 
     $his->cars = new \stdClass(); 
     foreach (Car::$all_cars as $car) { 
      $this->cars->$car = NULL; 
     } 
    } 

    public setRating($car, $rating) { 
     $this->cars->$car = $rating; 
    } 
} 

Class Car { 
    public static $all_cars = array(); 
    public $name; 

    public function __construct($name) { 
     $this->name = $name; 
     self::$all_cars[] = $this->name; 
    } 
} 

$bmw = new Car('bmw'); 
$benz = new Car('benz'); 
$tom = new Driver; 
foreach (Car::$all_cars as $car) { 
    $tom->setRating($car, $rating); // $rating comes from user input 
} 
+0

創建汽車的數組給了代碼工作的例子 –

+0

一個'Driver'只能有一個'bmw'或者他們可以擁有任意數量的他們? – Tigger

回答

2

PHP允許任何對象,例如在設置屬性

$tom = new StdClass; 
$tom->bmw = 95; 

同樣,只要屬性名稱是一個字符串,就可以使用屬性名稱的變量變量。

$car = 'bmw'; 
$tom = new StdClass; 
$tom->$car = 95; 

這將會把一個公共財產bmw$tom,然後你就可以用

echo $tom->bmw; // prints 95 

訪問您不能將對象分配到一個屬性,因爲它不是一個字符串,例如

$car = new Car; 
$tom = new StdClass; 
$tom->$car = 95; 

無法正常工作。你有一個__toString方法添加到Car對象,並設置名稱作爲汽車的一個屬性:現在你當

Class Car 
{ 
    private $name; 
    public function __construct($name) 
    { 
     $this->name = $name; 
    } 
    public function __toString() 
    { 
     return $this->name; 
    } 
} 

由於分配屬性名稱是一個字符串背景下,PHP將自動使用汽車的name屬性嘗試在字符串上下文中使用Car實例。沒有一種可以從變量名稱中推斷出名字的方法,例如你不能這樣做

$bmw = new Car; 

並希望得到它的寶馬。該名稱必須位於該對象中。

我已經提供了與你`Driver`類在https://3v4l.org/TjC89

相關問題