Rosmaro-operatoro en PHP

En oktobro 2019, Python 3.8 enkondukis la operatoron Walrus (:=) per VIGLEO 572 – kaj tiel ekigis unu el la plej grandaj polemikoj en la historio de la programlingvo. La debato estis tiel amara, ke la inventinto de Python Guido van Rossum en julio 2018 – eĉ antaŭ la eldono – lia pozicio kiel BDFL (Bonintenca Diktatoro Por La VivoEkde la komenco de 2019, Python anstataŭe estas regata de elektita Stira Konsilio.


if (n := len(items)) > 10:
    print(f"List is too long ({n} elements)")

La estrardisfalo ekestis tuj post la diskuto pri Walrus — malofta kazo, en kiu unuopa lingva trajto havis strukturajn konsekvencojn. En sia deklaro, van Rossum klarigis: "La lasta guto estis tre polemika propono por plibonigo de Python. Post kiam mi akceptis ĝin, homoj uzis sociajn retojn kiel Twitter kaj diris aferojn, kiuj vundis min persone."

Li daŭrigis: "Nun kiam PEP 572 finiĝis, mi neniam plu volas devi batali tiel forte por PEP kaj trovi, ke tiom da homoj abomenas miajn decidojn. Mi volas tute forigi min de la decidprocezo." La kritiko venis ne nur de la pli vasta komunumo, sed ankaŭ de kernaj programistoj.

Ili argumentis, ke la operatoro kontraŭdiris fundamentajn principojn de Python el la Zen de Python — precipe la preferon por simpleco super komplekseco. Post preskaŭ tri jardekoj kiel la senkontesta lingvodizajnisto, tio markis la finon de epoko. Sed dum Python devis enkonduki novan operatoron Walrus, dividante sian komunumon en la procezo, la demando ekestas: Kiel aliaj lingvoj traktas similajn konceptojn?

La Python-operatoro := (Tasko-esprimo kaŝnomo "Rosmaro") ne ekzistas en PHP - ĉar ĝi ne estas bezonata. En PHP, la tasko-operatoro = ĉiam Deklaro kaj esprimo samtempe: Asigno redonas la asignitan valoron. Jen ĝuste kial idiomaj ŝablonoj kiel "asignu-kaj-testu" funkcias en if-kondiĉoj sen propra lingva trajto.

function get_some_field() {
    return 'foo';
}
if ($a = get_some_field()) {
    echo $a; // foo
}
// Hinweis: $a ist *gesetzt*, selbst wenn die Bedingung falsy wäre.

$a = get_some_field() asignas kaj taksas al la dekstra flanko. Se ĉi tio estas "verema", vi enigas la if-Bloko. Fono: En Python, := (PEP 572) ĉar simplaj asignoj ne estas esprimoj. En PHP, ĉi tio ĉiam estis malsama, do ne ekzistas ekvivalenta bezono. Du aferoj ofte kondukas al cimoj.: = (Tasko) havas pli malaltan prioritaton ol plej multaj rilataj operatoroj; krampoj difinas la taksadon.

En pli kompleksaj esprimoj, oni ĉiam uzu krampojn por plibonigi legeblecon kaj klarecon. ?? havas sian propran, sufiĉe malaltan prioritaton. Tio klarigas surprizojn en esprimoj kiel $x ?? null === null. Sen krampoj, unue null === null taksita. Estas pli bone ĉiam eksplicite enkrampi: ($x ?? null) === null. $a ankaŭ ekzistas ekster la if-Blokoj – eble kun malvera valoro.

function get_some_field() {
    return 'bar';
}
if ( ($a = get_some_field()) === 'bar' ) {
    echo $a; // bar
}

Do estas klare, ke === 'bar' aplikiĝas al la asignita valoro. Krampoj gravas ĉi tie por legebleco kaj prioritato. En praktiko, ĉi tiu ŝablono evitas nenecesajn duoblajn alvokojn (ekz., de la serĉmendokonstruilo) per konservado de la serĉrezulto kaj poste kontrolado de ĝi. En produktivaj aplikaĵoj, kiel ekzemple Laravel-bazitaj projektoj, la jena ŝablono povas esti observita pli ofte.:

if ( ($foo = Foo::where('foo', 'bar')) && $foo->count() > 0 ) {
    dd($foo->get());
}

&& mallongcirkvitas: La dekstra parto estas taksata nur se la maldekstra parto estas vera. Asignante la deklaron suprenflue, vi evitas asigni la deklaron ekster la if-deklaro. Ĉu tio estas bona praktiko dependas de la kodo kaj analiziloj de via teamo; semantike, ĝi estas ĝusta. Minimume, vi devus scii, kion faras la kodo, se vi renkontas ĝin en la naturo.

PHP ne bezonas "Rosmaran operatoron" ĉar asignoj jam estas esprimoj. Tio ebligas idiomajn ŝablonojn kiel "asignu-kaj-testu" - efikajn kaj koncizajn. Samtempe, la postuloj pri disciplino pliiĝas: krampoj, striktaj komparoj, konscio pri vereco/malvereco, kaj klaraj teamaj konvencioj estas devigaj. Tiuj, kiuj sekvas ĉi tiujn gvidliniojn, rikoltas la avantaĝojn de la Rosmaran ideo sen postuli aldonan lingvan trajton.

Reen