Оператор Walrus в PHP

У жовтні 2019 року в Python 3.8 було представлено оператор Walrus (:=) через ПЕП 572 – і тим самим спровокував одну з найбільших суперечок в історії мови програмування. Дискусія була настільки запеклою, що винахідник Python Гвідо ван Россум у липні 2018 року – ще до звільнення – його посада BDFL (Доброзичливий диктатор на все життя). З початку 2019 року Python натомість керується обраною Керівною радою.


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

Розкол в управлінні виник одразу після обговорення Walrus — рідкісного випадку, коли одна мовна функція мала структурні наслідки. У своїй заяві ван Россум пояснив: «Останньою краплею стала дуже суперечлива пропозиція щодо покращення Python. Після того, як я її прийняв, люди звернулися до соціальних мереж, таких як Twitter, і сказали речі, які образили мене особисто».

Він продовжив: «Тепер, коли PEP 572 завершено, я ніколи більше не хочу так наполегливо боротися за PEP і бачити, що так багато людей ненавидять мої рішення. Я хочу повністю усунути себе з процесу прийняття рішень». Критика лунала не лише від ширшої спільноти, а й від основних розробників.

Вони стверджували, що цей оператор суперечить фундаментальним принципам Python з часів дзену Python , зокрема, перевагі простоти над складністю. Після майже трьох десятиліть як беззаперечного розробника мов це ознаменувало кінець епохи. Але хоча Python довелося запровадити новий оператор Walrus, що призвело до розділення його спільноти, виникає питання: як інші мови обробляють подібні концепції?

Оператор Python := (Вираз присвоєння, також відомий як "Walrus") не існує в PHP – бо він не потрібен. В 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' застосовується до призначеного значення. Дужки тут важливі для зручності читання та пріоритету. На практиці цей шаблон дозволяє уникнути непотрібних дублікатів викликів (наприклад, конструктора запитів), зберігаючи результат запиту, а потім перевіряючи його. У продуктивних застосунках, таких як проекти на базі Laravel, наступний шаблон можна спостерігати частіше.:

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

&& коротке замикання: права частина обчислюється лише тоді, коли ліва частина є істинною. Призначаючи оператор вище за течією, ви уникаєте призначення оператора поза оператором if. Чи є це гарною практикою, залежить від коду вашої команди та інструментів аналізу; семантично це правильно. Як мінімум, ви повинні знати, що робить код, якщо зіткнетеся з ним у реальному житті.

PHP не потребує "оператора Walrus", оскільки присвоєння вже є виразами. Це робить можливими ідіоматичні шаблони, такі як "присвоїти-та-перевірити" – продуктивні та лаконічні. Водночас зростають вимоги до дисципліни: обов'язковими є дужки, суворі порівняння, усвідомлення правдивості/хибності та чіткі командні домовленості. Ті, хто дотримується цих рекомендацій, отримують переваги ідеї Walrus, не потребуючи додаткової мовної функції.

Назад