Kiemelt kép

PHP 8 újdonságok I.: match expression

A PHP fejlesztőcsapata már egy ideje dolgozik a PHP következő főverzióján, a PHP 8.0-n, amely 2020. november 26-án fog megjelenni a tervek szerint, de kb. egy hete már elérhető az első alpha kiadás. Ebben a posztsorozatban meg fogjuk nézni, hogy milyen főbb változások és új nyelvi elemek érkeznek a PHP-ba. Elsőként a tegnap elfogadott match expressiont fogjuk megnézni.

A match valójában nem egy új dolog, hanem a switch egy sokkal biztonságosabb és modernebb verziója. Más nyelveknél is látni hasonló megoldásokat. Az újabb nyelvek közül pl. a Kotlin is ismeri ezt a funkciót (when néven), a C# tavaly év végén vezette be a 8.0 verzióval, a Java pedig a 12-es verzióval pár éve. A Rustban szintén match néven van ilyen expression.

Eltérések a switch-hez képest:
  • Nincsenek break;-ek: Ez azt jelenti, hogy lehagyni se tudjuk véletlenül és így sokkal biztonságosabb a match használata. Ettől függetlenül tudunk több feltételre érvényes case ágat csinálni, ha az értékeket vesszővel választjuk el.
  • Lehet visszatérési értéke, vagyis a match eredményét egy változóba tudjuk például íratni. Ez hasznos, amikor egy switch segítségével döntjük el, hogy mi legyen egy változó értéke vagy pl. a Factory patternben.
  • Nincs típuskonverzió. A match ===-et használ.
  • Egyből kiderül, ha nem kezelünk le egy esetet. A match dob egy UnhandledMatchError kivételt, ha nem talál egyezést egyik case ágon sem.
Nézzünk egy-két példát!

Most, hogy már tudjuk miben tér el a switch-től, ideje megnézni pár példán keresztül ez mit is jelent a gyakorlatban.

Ez a kódrészlet az RFC első példája, amely a Doctrine könyvtárból származik:

A példán nagyszerűen szembetűnik, hogy se case, se break. A switch (üres sorokkal együtt) egy 17 soros kód, ezzel ellentétben a match csak 6 sor. Ráadásul sokkal-sokkal szebb és átláthatóbb is. 

De nézzünk egy ennél hétköznapibb példát. Képzeljük el, hogy egy webshop motor fejlesztésén dolgozunk, ahol a fizetési modulnál előfordulhat bankkártyás, készpénzes és banki átutalásos fizetési mód. Írunk egy PaymentFactory osztályt, ami visszatér a megfelelő PaymentService implementációval (ami majd kezeli a fizetési móddal kapcsolatos műveleteket).

Ha hasznosnak találtad ezt a posztot, kérlek oszd meg másokkal is! :)


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