abstract class BaseDelivery implements DeliveryInterface
{
protected int $id;
protected string $name;
protected int $type = self::TYPE_ALL;
protected array $paymentTypes;
public function __construct(array $config = [])
{
unset($config['type'], $config['paymentTypes']);
foreach ($config as $name => $value) {
$this->{$name} = $value;
}
}
public function getId(): int
{
return $this->id;
}
...
public function getPaymentTypes(): array
{
return $this->paymentTypes;
}
}
class DeliveryManager
{
private $deliveries = [];
public function setDelivery(DeliveryInterface $delivery)
{
$this->deliveries[$delivery->getId()] = $delivery;
}
public function setDeliveryClass(int $id, string $className, array $config = [])
{
$config['id'] = $id;
$delivery = new $className($config);
$this->setDelivery($delivery);
}
public function getDelivery(int $id): DeliveryInterface
{
if (!isset($this->deliveries[$id])) {
throw new InvalidArgumentException("Delivery #$id not found");
}
return $this->deliveries[$id];
}
}
мы к массиву арифметически прибавляем строку(или?)мы складываем 2 массива
Менеджер так понял создает свой конфиг при регистрации СД и передает их к классам доставок? Правильно?это упрощенный пример, в реальном коде используется абстрактная фабрика для создания DeliveryInterface объектов, которая в свою очередь использует DI контейнер.
class Address
{
public function getId(): ?int {}
public function getCountry(): string {}
public function getCountryCode(): int {}
public function getRegion(): string {}
public function getRegionCode(): int {}
public function getSettlement(): string {} // поселение - город, деревня, село
public function getSettlementId(): int {}
public function getStreet(): ?string {} // адрес: улица, дом, квартира/офис
public function getZipCode(): ?string {} // почтовый индекс
public function getCoordinates(): ?array {} // координаты: широта и долгота для отображения на карте
public function __toString(): string {} // строка адреса: страна, регион и т.д.
}