@yellow_pus

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

Как описать классы, чтобы при создании нового экзепляра класса, старые параметры сохранялись? Например, я хочу произвести сумму двух чисел и всего лишь мне нужно вызвать:
$first = new A(2);
$second = new A(3);
$result = (new A())->summirize();

Я попробовал реализовать этот код вот так:
abstract class sum
{
    protected $first;
    protected $second;
    public function __construct($first = null,$second = null)
    {
        $this->first = $first;
        $this->second = $second;
    }
    abstract public function summirize();
}
class A extends sum
{
    public function summirize()
    {
        return $this->first + $this->second;
    }
}
$first = new A(2);
$second = new A(3);
$result = (new A())->summirize();

Это код-набросок, я изначально понимал, что это ни к чему не приведет. Насколько я знаю, в ООП для таких целей есть паттерн, поскольку я ранее видел пакеты, которые работают по такому механизму
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Такое, конечно, можно сделать через статическое свойство со списком экземпляров класса, но зачем нужен такой изврат? В каких реальных целях его применять?
class A
{
    private static array $instances = [];
    public readonly int $value;
  
    public function __construct(?int $value = null)
    {
        if ($value !== null) {
            $this->value = $value;
            static::$instances[] = $this;
        }
    }

    public function summ(): int
    {
        return array_reduce(
            static::$instances,
            fn($acc, $cur) => $acc + $cur->value,
            0
        );
    }
}

new A(2);
new A(3);
$summ = (new A())->summ();
print $summ; // 5
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽