Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Как передать не все параметры при объявлении экземпляра класса?

Как передать только второй параметр? Я задал значения по умолчанию, но второму экземпляру надо передать только второй.
class Car { public $brend; public $speed; public $color;
public function __construct($brend = '*', $speed = 0, $color = '*'){ $this->brend = $brend; $this->speed = $speed; $this->color = $color; } }
$car1 = new Car('Moskvych', 'Green', 15); $car2 = new Car(200);
echo '

';
print_r($car1);
/*Первый Car Object ( [brend] => Moskvych [speed] => 120 [color] => Green ) */
echo '
';
print_r($car2);
/*Второй
Вот что получается Car Object ( [brend] => 200 // скорость передалась в бренд (по умолчанию *) [speed] => 0 // осталось по умолчанию [color] => * ) */


Ответ

Этот пример - всего лишь мой взгляд на решение задачи. Я думаю, что если нужно вызывать класс с параметрами по умолчанию, которые или редко изменяются, или изменяются частично, то можно объявить свойства со значениями по умолчанию прямо в классе (а не перезаписывать свойства в конструкторе класса)
Свойства класса я бы сделал не доступными для чтения и записи вне самого класса. Для доступа к ним можно написать пару соответствующих методов. А в случае попытки записи в не существующее свойство класса бросать исключение.
Реализация с параметрами по умолчанию:
$car1 = new Car;
var_dump( $car1->getProperties() );
Передача одного параметра двумя аргументами, где:
speed - имя перезаписываемого свойства класса 200 - новое значение
(остальные - по умолчанию)
$car2 = new Car; $car2->setProperty('speed', 200);
var_dump( $car2->getProperties() );
Передача нескольких параметров одним аргументом - ассоциативным массивом, ключи которого соответствуют названиям свойств, а значения - новым значениям:
$car2->setProperty([ 'brend' => 'Volga', 'color' => 'Red' ]);
var_dump( $car2->getProperties() );
При попытке передачи не существующих свойств будет брошено исключение, и использованы значения свойств по умолчанию:
$car3 = new Car; $car3->setProperty([ 'my_brend' => 'Kamaz', 'color' => 'Lime', 'speed' => 500 ]);
var_dump( $car3->getProperties() );

Код класса:
class Car { /** * Свойства класса со значениями по умолчанию */ private $brend = 'Moskvych'; private $color = 'Green'; private $speed = 150;
/** * Метод для проверки свойств и генерации исключений */ private function propertyExists($property) { if (! property_exists(__CLASS__, $property)) { $message = "Обращение к не существующему свойству: $property !"; throw new Exception($message); } }
/** * Метод для перезаписи свойств или выброса исключений */ public function setProperty($property, $value = '') { try { if (is_array($property)) { foreach ($property as $property => $value) { $this->propertyExists($property); $this->$property = $value; } } else { $this->propertyExists($property); $this->$property = $value; } } catch (Exception $e) { echo '', $e->getMessage(), ''; } }
/** * Метод для получения всех свойств класса */ public function getProperties() { foreach ($this as $property => $value) { $data[$property] = $value; } return $data; } }

Комментариев нет:

Отправить комментарий