Задать вопрос
@awenn2015
Веб-программист самоучка

Есть ли в php аналог data class kotlin?

Можно ли избавиться от таких бесполезных конструкций в пользу чего нибудь более сахарного как в kotlin?

<?php

class Product {
  public string $articul;
  public string $brand;
  public string $cvet;
  public string $cvet_a;
  public string $cvet_p;
  public string $cvetovaya_temperatura;
  public string $datchik_d;
  public string $diametr;
  public string $diametr_v_o;
  public string $dimmer;
  public string $dlina;
  public string $forma_l;
  public string $forma_p;
  /** @var string[] $gall */
  public array $gall;
  public string $garantiya;
  public string $glubina;
  public string $id;
  public string $interier;
  public string $kkollekcia;
  public string $kolichestvo_l;
  public string $lampy_k;
  public string $material_a;
  public string $material_p;
  public string $mesto;
  public string $moschnost_l;
  public string $moschnost_o;
  public string $name;
  public string $napryazhenie;
  public string $nizkie_p;
  public string $photo;
  public string $ploschad_o;
  public string $price;
  public string $price_old;
  public string $pult;
  public string $sfera;
  public string $shirina;
  public string $shtrihkod;
  public string $srok;
  public string $stepen_zaschity;
  public string $stil;
  public string $stock;
  public string $strana;
  public string $svetovoy_potok;
  public string $tip_c;
  public string $tip_kreplenia;
  public string $tip_l_d;
  public string $tip_l_o;
  public string $ves;
  public string $vidy_m;
  public string $vysota;
  public string $vysota_v_ch;

  public function __construct(
    string $articul,
    string $brand,
    string $cvet,
    string $cvet_a,
    string $cvet_p,
    string $cvetovaya_temperatura,
    string $datchik_d,
    string $diametr,
    string $diametr_v_o,
    string $dimmer,
    string $dlina,
    string $forma_l,
    string $forma_p,
    array $gall,
    string $garantiya,
    string $glubina,
    string $id,
    string $interier,
    string $kkollekcia,
    string $kolichestvo_l,
    string $lampy_k,
    string $material_a,
    string $material_p,
    string $mesto,
    string $moschnost_l,
    string $moschnost_o,
    string $name,
    string $napryazhenie,
    string $nizkie_p,
    string $photo,
    string $ploschad_o,
    string $price,
    string $price_old,
    string $pult,
    string $sfera,
    string $shirina,
    string $shtrihkod,
    string $srok,
    string $stepen_zaschity,
    string $stil,
    string $stock,
    string $strana,
    string $svetovoy_potok,
    string $tip_c,
    string $tip_kreplenia,
    string $tip_l_d,
    string $tip_l_o,
    string $ves,
    string $vidy_m,
    string $vysota,
    string $vysota_v_ch
  ) {

    $this->articul = $articul;
    $this->brand = $brand;
    $this->cvet = $cvet;
    $this->cvet_a = $cvet_a;
    $this->cvet_p = $cvet_p;
    $this->cvetovaya_temperatura = $cvetovaya_temperatura;
    $this->datchik_d = $datchik_d;
    $this->diametr = $diametr;
    $this->diametr_v_o = $diametr_v_o;
    $this->dimmer = $dimmer;
    $this->dlina = $dlina;
    $this->forma_l = $forma_l;
    $this->forma_p = $forma_p;
    $this->gall = $gall;
    $this->garantiya = $garantiya;
    $this->glubina = $glubina;
    $this->id = $id;
    $this->interier = $interier;
    $this->kkollekcia = $kkollekcia;
    $this->kolichestvo_l = $kolichestvo_l;
    $this->lampy_k = $lampy_k;
    $this->material_a = $material_a;
    $this->material_p = $material_p;
    $this->mesto = $mesto;
    $this->moschnost_l = $moschnost_l;
    $this->moschnost_o = $moschnost_o;
    $this->name = $name;
    $this->napryazhenie = $napryazhenie;
    $this->nizkie_p = $nizkie_p;
    $this->photo = $photo;
    $this->ploschad_o = $ploschad_o;
    $this->price = $price;
    $this->price_old = $price_old;
    $this->pult = $pult;
    $this->sfera = $sfera;
    $this->shirina = $shirina;
    $this->shtrihkod = $shtrihkod;
    $this->srok = $srok;
    $this->stepen_zaschity = $stepen_zaschity;
    $this->stil = $stil;
    $this->stock = $stock;
    $this->strana = $strana;
    $this->svetovoy_potok = $svetovoy_potok;
    $this->tip_c = $tip_c;
    $this->tip_kreplenia = $tip_kreplenia;
    $this->tip_l_d = $tip_l_d;
    $this->tip_l_o = $tip_l_o;
    $this->ves = $ves;
    $this->vidy_m = $vidy_m;
    $this->vysota = $vysota;
    $this->vysota_v_ch = $vysota_v_ch;
  }
}
  • Вопрос задан
  • 339 просмотров
Подписаться 1 Простой 14 комментариев
Решения вопроса 2
@tukreb
Можно, в php 8.0 ввели сахар Constructor Property Promotion
https://wiki.php.net/rfc/constructor_promotion
https://stitcher.io/blog/constructor-promotion-in-php-8
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Александр Антонов, а где у вас там типы? Один массив и строки я увидел, ну и сам json это строки по сути, можно магии повесить, ваш json после decode массив, его кидаете в конструктор, тупо ключ => значение
Далее записываете его в свойство, а из свойства магический геттер
class MyJson
{

    private array $data;

    public function __construct(array $array)
    {
        $this->data = $array;
    }

    public function __call(string $name, array $arguments)
    {
        $action = substr($name, 0, 3);
        $property = strtolower(substr($name, 3));
        switch ($action) {
            case 'get':
                return $this->data[$property ] ?? null;

            case 'set':
                $this->data[$property] = $arguments[0];

                break;
        }
    }

    public function __set(string $name, $value)
    {
        $this->data[$name] = $value;
    }

    public function __get(string $name)
    {
        return array_key_exists($name, $this->data)) ? $this->data[$name] : null;
    }

    public function __isset($name): bool
    {
        return isset($this->data[$name]);
    }

    public function __unset($name): void
    {
        unset($this->data[$name]);
    }
}


$json = new MyJson(json_decode($json, true));

echo $json->name;
$json->name = 'test';
echo $json->getName();
$json->setName('test2');
echo $json->name;


Писал с телефона. Могут быть опечатки.
Почитать тут
https://www.php.net/manual/ru/language.oop5.magic.php
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы