Kiemelt kép

PHP 8 újdonságok VI - egyszerűsített konstruktor

A PHP fejlesztőcsapata 2020 végén kiadta a PHP következő főverzióját, a PHP 8.0-t. Ebben a posztsorozatban megnézzük, hogy milyen főbb változások és új nyelvi elemek érkeztek a PHP-ba. Az előző posztokban már megnéztük a kisebb-nagyobb változásokat (match, típusosság, attribútumok, új függvények), de még maradt 3 nagyobb újdonság (V-VII. poszt), amelyeket a következő napokban fogunk megnézni alaposabban. 

Ebben a posztban a constructor property promotion RFC-ről lesz szó, amelyet magyarra lefordítva talán egyszerűsített konstruktornak lehetne nevezni. Nézzük is miről van szó!

Szintaxis

Az új szintaxisnak hála egyszerűbben, egy lépésben tudunk (típusos) osztályváltozókat definiálni és konstruktorban értéket adni nekik. Ehhez nézzük meg, hogy néz ki egy egyszerű adatosztály (DTO) PHP 7.4-ben és mennyivel egyszerűbb lesz ezt megírni PHP 8.0+ verziókban. 

A képen jól látható, hogy a kódunk sokkal rövidebb lett. Az osztályváltozók típusai (type) és a láthatósági módosító kulcsszavak (modifier) is bekerültek a konstruktorunkba, így külön már nem kell azokat deklarálni. Természetesen épp úgy lehet itt is alapértelmezett értékeket megadni.

Előnyök
  • A legkézenfekvőbb előny, hogy sokkal rövidebb lesz a kódunk. Ha belegondolunk, ez jól tud jönni, hiszen tipikusan nem 1-2 változós DTO osztályokkal szoktunk dolgozni.
  • Egy helyen vannak az osztályváltozók deklarálva, az értékadások, így nem tudjuk elfelejteni, hogy konstruktorba is berakjunk egy újonnan létrehozott változót.
  • A named arguments RFC-nek hála pedig az ún. spread operátorral a kulcs-érték párokkal ellátott tömböket könnyen át tudjuk adni és ezzel megspórolhatjuk a mezőnként történő értékátadást az újonnan létrehozni kívánt DTO példányunknak. Például: $message = new Message(…$message);
Erre figyelni kell!
  • Természetesen nem lehet egy változót konstruktoron kívül és belül is deklarálni.
  • Valószínűleg nem gyakori, de abstract class esetén nem használható a property promotion, traitek esetében viszont igen.
  • Variadic paraméterek esetében sem működik.
  • Működik öröklődés esetén, de itt kézzel kell átadni a szülőosztály számára.
  • Ha attribútumokat használunk, akkor az egyszerre érvényesül, mint property és parameter attribute. 

Források:
Constructor Property Promotion RFC
stitcher.io blog


Ha nem szeretnél lemaradni a hasonló posztokról, kövesd a blog Facebook oldalát!