Как создавать объект с большим количеством свойств? Привет. Для иллюстрации вопроса я приведу сферический пример в вакууме. Есть класс, задача которого - записывать данные о продукте в файл. Метод write() принимает в качестве параметра объект класса Product и уверен, что в объекте есть нужные свойства.Class ProductWriter { public function write(Product $product) { // write to file } } Product имеет много свойств (порядка 20): название, описание, цена, размер, цвет, форма и т.д. и т.п. Причем часть свойств - обязательна, часть - опциональна. Как оптимально написать класс Product? Мои варианты: 1) Конструктор класса Product принимает ассоциативный массив параметров. В конструкторе проверяется наличие обязательных полей. Мне кажется этот способ не самым лучшим: клиентский код не знает, какие ключи должны присутствовать во входном массиве. 2) Создать кучу свойств и геттеров/сеттеров для них:Class Product { private $name; private $price; // ... public function setName() {} public function setPrice() {} // ... public function getName() {} public function getPrice() {} // ... } Но опять же - откуда клиентскому коду знать, что после создания объекта нужно обязательно вызвать некоторые сеттеры?$product = new Product(); $product->setName('name'); $product->setPrice('0.0'); 3) Ну и самый треш - конструктор с 20 параметрами:Class Product { function __construct($name, $price, $color, $size, ....) { } } Так, конечно, клиенсткий код точно укажет все обязательные поля. Но так делать не стоит, в книжках написано)) Если говорить о вариантах №1 и №2: на самом деле этим классом никто кроме меня самого пользоваться не будет. А я то точно знаю, что нужно заполнить о продукта. Но хотелось бы решить задачу "красиво".PS. Предвижу комментарии в духе: почему один общий класс продукт? Создай подклассы только с нужными свойствами и будет тебе счастье. На это отвечу, что мой пример с продуктом - условный. В моем случае действительно сущность с кучей свойств, от которой нельзя ничего унаследовать и разбить на более простые сущности.
В данной ситуации, я бы предложил использовать комбинацию вариантов №1 и №2.
Вы можете создать класс Product с приватными свойствами для каждого параметра продукта и публичными сеттерами и геттерами для работы с этими свойствами. Таким образом, у вас будет возможность контролировать значения каждого свойства и предоставить клиентскому коду удобный интерфейс для работы с объектом Product.
Дополнительно, вы можете создать конструктор, который будет принимать массив параметров и заполнять свойства объекта на основе этого массива. В конструкторе вы можете проверять наличие обязательных свойств и выбрасывать исключения в случае их отсутствия.
Таким образом, у вас будет возможность создавать объекты класса Product с различными наборами свойств, контролировать их значения и обеспечить удобство использования для клиентского кода.
В данной ситуации, я бы предложил использовать комбинацию вариантов №1 и №2.
Вы можете создать класс Product с приватными свойствами для каждого параметра продукта и публичными сеттерами и геттерами для работы с этими свойствами. Таким образом, у вас будет возможность контролировать значения каждого свойства и предоставить клиентскому коду удобный интерфейс для работы с объектом Product.
Дополнительно, вы можете создать конструктор, который будет принимать массив параметров и заполнять свойства объекта на основе этого массива. В конструкторе вы можете проверять наличие обязательных свойств и выбрасывать исключения в случае их отсутствия.
Таким образом, у вас будет возможность создавать объекты класса Product с различными наборами свойств, контролировать их значения и обеспечить удобство использования для клиентского кода.