pronto.ee

Tomorrow will be cancelled due to lack of interest

PHP8: match avaldis

PHP

Ma olen viimastel aastatel päris palju pidanud algajate arendajate koodi hindama ja üks asi mis mulle silma torkab on see kui harva kasutatakse switch-i tingimuste lahendamiseks. Selle asemel leiab koodist erineval kujul terve leegioni if, else ja elseif lauseid. Ma ei hakka sellest hetkel pikemalt pajatama; jätke lihtsalt meelde, et switch on teie sõber. Kui seda õigesti kasutada siis muudab see koodi loetavamaks ja lühemaks.

PHP8 tõi sisse uue viisi tingimustega tegelemiseks mis on segu switch-ist ja kolmekordsetest (ternary) operaatoritest. Kui ei tule kohe meelde mida kolmekordne operaator endast kujutab, siis tüüpiliselt näeb see välja selline:

$i = $condition ? 'true' : 'false';

Uue viisi nimi on match ja kui tingimused klapivad, siis muudab see koodi veelgi lühemaks ja veelgi loetavamaks. Pidage meeles, et iga rida koodi on midagi mida tuleb jooksvalt hooldada ja vajaduse korral uuendada. Kui loetavus sellest ei kannata, siis mida vähem koodi seda parem. Toon siinkohas ühe näite kasutades eelmises postituses mainitud anonüümseid funktsioone:

$animal = 'dog';

$voice = match($animal) {
    'dog' => function() {return 'woof';},
    'cat' => function() {return 'meow';},
    'poro' => function() {return 'perkele!';},
    default => function() {return 'huh?';}
};

echo $voice();

Siinkohas oleks paslik ära märkida paar nüanssi. Esiteks match eeldab, et muutuja $animal on deklareeritud. Kuigi ta selle peale tööd ei katkesta ning väärtustab tulemi default-iga, kuvab ta vaikimisi hoiatuse: Warning: Undefined variable $animal

Teiseks on oluline, et match-i parameeter ja väärtus millega võrreldakse ('dog', 'cat', jne.) oleks sama tüüpi. Näiteks kui võrrelda väärtuseid 1 ja '1', siis on tulemuseks default. See on sarnane PHP === võrdlusega, kus erinevaid tüüpe ei ühtlustata nagu tehakse == võrdluse puhul.

Kolmandaks PEAB valik sisaldama tõest väärtust (kasvõi default-i näol). Kui lahendit ei leita on tulemuseks: Fatal error: Uncaught UnhandledMatchError: Unhandled match value of type string in ...

Teinekord kasutavad arendajad analoogse tulemuse jaoks nimelisi massiive:

$animal = 'dog';
$voices = [
    'dog' => function() {return 'woof';},
    'cat' => function() {return 'meow';},
    'poro' => function() {return 'perkele!';}
];

echo $voices[$animal]();

Sellel on kaks eelist: esiteks nagu näha on see ilma kontrollideta veelgi lühem ja teiseks töötab see varajasemate PHP versioonidega. Samas ei toeta see default-i mis praktikas tähendab seda, et tuleb kontrollida kas sellise nimega element eksisteerib, funktsioonid deklareeritakse isegi siis kui neid ei kasutata (see ei ole probleem kui väärtuseks on skalaarmuutujad nagu int, float, string jne.) ja tüüpi ei kontrollita. Sellise lahenduse kasutamine on iseenesest samuti ok ehk siis valik tuleb teha lähtuvalt ülaltoodud piirangutest.

5 Comments

  • Reply bbsummer |

    yo.
    memcpy podcastis räägiti, et bbsummer oli olnud huvitav. millal bbsummer toimub, lehel bb.ee on info, et toimub seeaasta. või oli ära juba. aga link annab veateate, et timed out. isegi telnet bbsummer.bb.ee adre on, aga ka see on timed out või mingi selline veateade. seal telnetis on taga bbs muidu? kindlasti tuleb huvitav üritus. ega ei tea kas eestis on olemas packet radio packet bbs-e. usas on see kuum teema.

  • Reply Jah |

    Mind hakkas ka see BBSummeri teema huvitama. Pronto kindlasti teab millal see toimub. Vanades .exe ajakirjades on ka sellest juttu. Milline seltkond seal muidu on, kas arvutimänguhuvilised.

  • Reply Midaaaa |

    Ma olen ka kuulnud bbsummerist igasugu huvitavaid lugusid. Oleneb palju osavõtutasu on, muidu oleks võibolla huvitatud. See on siis nagu õllesummer aga lisaks arvutialased koolitused. Eks see nimi õllesummerist tuli või rocksummerist. Et midagi mängudeöö sarnast siis plus õlu. Kui Marvet ja Sarvik ka sinna lähevad siis on hea üritus i think. Sarvik on eelmise aasta parim koolitaja oma koolitusfirmas. Keegi kirjutas .exe ajakirjast, see on internetis olemas punktexe.ee. Selline ajakiri võiks veel ilmuda aga pole sellist firmat nagu Microlink, kes seda orgunniks. Zone.ee võiks seda korraldada, nad suurim hostigufirma eestis. Ja kas BBAutumn ja BBWinter, BBSpring ka tulevad või.

  • Reply pronto |

    Selle aasta BBSummeri tutvustus ütleb järgenvat:

    Kui tuumasõda vahepeal Eestit maa pealt ära ei pühi, siis täpselt poole aasta pärast, 27.08.22 toimub BBSummer Resurrections.
    Üritusel osalemise eeldus on eelnev kokkupuude FidoNetiga.

    Eelpoolmainitud sait on mingi kaks nädalat juba kraavis olnud. Uurin kes sellega ei tegele ja miks. Võib-olla on tuumasõda juba meist üle pühkinud nii, et ma pole märganud.

  • Reply bbsummer |

    yo
    see telnet bbs.bbsummer.ee 665 pole veel tööle hakanud. kesiganes sellega tegeleb, see ei tohiks eriti keeruline olla tööle saada. kunagi 90-ndatel oli hea echosid lugeda. modereeritud keskkond ja eriti läbu polnud. ega arvutuajakirju ka pole enam, kunagi olid Arvutikasutaja ja Arvutimaailm. kas bbsummer on ainult ühepäevane? kunagi oli ikka 3 päeva ja ettekanded, esinejad ja bändid.

Post a comment