PHPдеги морж оператору

2019-жылдын октябрында Python 3.8 Walrus операторун (:=) аркылуу PEP 572 – жана ошону менен программалоо тилинин тарыхындагы эң чоң талаш-тартыштардын бирине түрткү болду. Талаш-тартыш Python ойлоп табуучусу ушунчалык ачуу болду Гидо ван Россум 2018-жылдын июлунда - бошотулганга чейин - BDFL катары анын орду (Өмүр бою кайрымдуу диктатор). 2019-жылдын башынан бери Python анын ордуна шайланган Жетектөөчү Кеңеш тарабынан башкарылат.


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

Башкаруудагы ажырым морждун талкуусунан кийин дароо эле пайда болгон — сейрек учур, бир тилдин өзгөчөлүгү структуралык кесепеттерге алып келген. Өзүнүн билдирүүсүндө ван Россум мындай деп түшүндүрдү: "Акыркы саман абдан талаштуу Python Enhancement сунушу болду. Мен аны кабыл алгандан кийин, адамдар Twitter сыяктуу социалдык тармактарга кирип, жеке менин көңүлүмдү ооруткан сөздөрдү айтышты."

Ал мындай деп улантты: "Эми PEP 572 аяктагандан кийин, мен эч качан PEP үчүн мынчалык катуу күрөшүүнү каалабайм жана ушунча адамдар менин чечимдеримди жек көрүп жатканын байкагым келбейт. Мен өзүмдү чечим кабыл алуу процессинен толугу менен четтетгим келет." Сын кеңири коомчулуктан гана эмес, негизги иштеп чыгуучулардан да келди.

Алар оператор Python Зенинин негизги Python принциптерине карама-каршы келет деп ырасташкан - өзгөчө татаалдыкка караганда жөнөкөйлүктү артык көргөн. Талашсыз тил дизайнери катары дээрлик отуз жыл өткөндөн кийин, бул бир доордун аяктаганын белгиледи. Бирок Python жаңы Walrus операторун киргизүүгө туура келип, бул процессте коомчулугун бөлүп, суроо туулат: Башка тилдер ушул сыяктуу түшүнүктөрдү кантип колдонушат?

Python оператору := ("Walrus" дайындоосу) PHPде жок – анткени ал керек эмес. РНРде дайындоо оператору = ар дайым Бир эле учурда билдирүү жана билдирүү: Тапшырма берилген маанини кайтарат. Дал ушундан улам "дайындоо жана сыноо" сыяктуу идиомалык үлгүлөр иштейт if-өзүнүн тилдик өзгөчөлүгү жок шарттар.

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() оң жагына дайындайт жана баалайт. Эгер бул "чындык" болсо, сиз киресиз if- Блок. Фон: Python тилинде, := (PEP 572) анткени жөнөкөй тапшырмалар туюнтма эмес. PHPде бул ар дайым башкача болуп келген, андыктан эквиваленттүү муктаждык жок. Эки нерсе көбүнчө мүчүлүштүктөргө алып келет.: = (Дайындоо) реляциялык операторлордун көбүнө караганда төмөнкү артыкчылыкка ээ; кашаалар бааны аныктайт.

Татаал туюнтмаларда окулушун жана түшүнүктүүлүгүн жогорулатуу үчүн дайыма кашааларды колдонушуңуз керек. ?? өзүнүн, тескерисинче, төмөн артыкчылыкка ээ. Бул сыяктуу сөздөрдүн сюрприздерин түшүндүрөт $x ?? null === null. Кашаасыз, биринчи null === null бааланган. Ар дайым ачык кашаага алуу жакшы: ($x ?? null) === null. $a сыртында да бар if-Блоктор - балким, жалган мааниге ээ.

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

Демек, бул түшүнүктүү === 'bar' дайындалган мааниге колдонулат. Бул жерде кашаалар окулушу жана артыкчылыктуулугу үчүн маанилүү. Иш жүзүндө, бул үлгү суроонун натыйжасын сактоо жана андан кийин текшерүү аркылуу керексиз кайталанма чалуулардан (мисалы, суроо куруучудан) качат. Ларавелге негизделген долбоорлор сыяктуу жемиштүү тиркемелерде төмөнкү үлгүнү көбүрөөк байкаса болот.:

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

&& кыска туташуу болуп саналат: Оң бөлүк сол бөлүгү чын болсо гана бааланат. Операцияны жогору агымга дайындоо менен, сиз if операторунун сыртында операторду дайындоодон качасыз. Бул жакшы практика болобу, бул сиздин командаңыздын кодунан жана талдоо куралдарынан көз каранды; семантикалык жактан туура. Жок дегенде, жапайы жаратылышта аны жолуктурсаңыз, код эмне кылаарын билишиңиз керек.

PHPге "морж операторунун" кереги жок, анткени дайындоолор мурунтан эле туюнтмалар. Бул "дайындоо жана сыноо" сыяктуу идиомалык үлгүлөрдү мүмкүн кылат - аткаруучу жана кыска. Ошол эле учурда тартипке карата талаптар күчөйт: кашаа, катуу салыштыруу, чындыкты/жалганды түшүнүү, команданын так конвенциялары милдеттүү. Бул көрсөтмөлөрдү аткаргандар кошумча тил өзгөчөлүгүн талап кылбастан, Walrus идеясынын пайдасын алышат.

Артка