2016-10-29 3 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 
} 

Вопрос:

Как реализовать это?

Ограничения:

  • Количество объектов автомобиль не переменных и неизвестных (таким образом, не статические имена свойств в классе Driver).
  • Каждый водитель имеет рейтинг для каждого объекта в классе автомобилей.
  • Оценочное свойство должно быть определено в классе водителей намеренно.

То, что я думаю:

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

Создать массив автомобилей в 'Driver' класса –

+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 к объекту автомобиля и установите имя как свойство автомобиля:

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

Поскольку присвоение имени свойства является контекстом строки, PHP будет автоматически использовать свойство Названия автомобиля теперь, когда вы попробуйте использовать экземпляр Car в контексте строки. Разумеется, нет разумного способа вывести имя из имени переменной, например. вы не можете сделать

$bmw = new Car; 

и надеемся получить из него bmw. Имя должно быть в объекте.

я привел пример, который работает с кодом, вы дали на https://3v4l.org/TjC89

Смежные вопросы