PHP'de Mors operatörü

Ekim 2019'da Python 3.8, Walrus operatörünü tanıttı (:=) aracılığıyla PEP 572 – ve böylece programlama dili tarihindeki en büyük tartışmalardan birini tetikledi. Tartışma o kadar sertti ki, Python'un mucidi Guido van Rossum Temmuz 2018'de - hatta serbest bırakılmasından önce - BDFL'deki pozisyonu (Ömür Boyu Hayırsever Diktatör). 2019'un başından bu yana Python, seçilmiş bir Yönlendirme Konseyi tarafından yönetiliyor.


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

Yönetim anlaşmazlığı, Walrus tartışmasının hemen ardından ortaya çıktı; tek bir dil özelliğinin yapısal sonuçlar doğurduğu nadir bir durum. Van Rossum açıklamasında şöyle diyor: "Bardağı taşıran son damla, çok tartışmalı bir Python Geliştirme Önerisi oldu. Ben kabul ettikten sonra insanlar Twitter gibi sosyal medya platformlarına yöneldi ve beni kişisel olarak inciten şeyler söyledi."

Şöyle devam etti: "PEP 572 sona erdiğine göre, bir daha asla bir PEP için bu kadar mücadele etmek ve bu kadar çok insanın kararlarımdan nefret ettiğini görmek istemiyorum. Kendimi karar alma sürecinden tamamen çıkarmak istiyorum." Eleştiriler yalnızca geniş topluluktan değil, aynı zamanda çekirdek geliştiricilerden de geldi.

Operatörün , Python Zen'indeki temel Python prensipleriyle, özellikle de karmaşıklığa karşı basitliği tercih etmesiyle çeliştiğini savundular. Tartışmasız dil tasarımcısı olarak neredeyse otuz yıl geçirdikten sonra, bu bir dönemin sonu anlamına geliyordu. Ancak Python, topluluğunu bu süreçte bölen yeni bir Walrus operatörü sunmak zorunda kalırken, şu soru ortaya çıkıyor: Diğer diller benzer kavramları nasıl ele alıyor?

Python operatörü := (Atama İfadesi takma adı "Walrus") PHP'de mevcut değildir; çünkü buna ihtiyaç duyulmaz. PHP'de, atama operatörü = Her zaman Aynı anda hem ifade hem de söylem: Bir atama, atanan değeri döndürür. "Ata ve test et" gibi deyimsel kalıpların işe yaramasının nedeni tam olarak budur. if-Kendi dil özelliği olmayan koşullar.

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() sağ tarafa atar ve değerlendirir. Eğer bu "doğru" ise, if-Blok. Arka Plan: Python'da, := (PEP 572) çünkü basit atamalar ifade değildir. PHP'de bu her zaman farklı olmuştur, bu yüzden eşdeğer bir ifadeye gerek yoktur. Hatalara genellikle iki şey yol açar.: = (Atama) çoğu ilişkisel operatörden daha düşük önceliğe sahiptir; parantezler değerlendirmeyi belirler.

Daha karmaşık ifadelerde okunabilirliği ve anlaşılırlığı artırmak için parantezleri her zaman kullanmalısınız. ?? kendi düşük önceliğine sahiptir. Bu, şu gibi ifadelerdeki sürprizleri açıklar: $x ?? null === null. Parantezsiz, ilk olarak null === null değerlendirildi. Her zaman açıkça parantez içine almak daha iyidir: ($x ?? null) === null. $a ayrıca dışarıda da mevcuttur if-Bloklar – muhtemelen yanlış bir değerle.

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

Yani açıktır ki === 'bar' Atanan değere uygulanır. Okunabilirlik ve öncelik açısından parantezler burada önemlidir. Pratikte bu kalıp, sorgu sonucunu depolayıp ardından kontrol ederek gereksiz yinelenen çağrıları (örneğin, sorgu oluşturucu çağrılarını) önler. Laravel tabanlı projeler gibi üretken uygulamalarda, aşağıdaki kalıp daha sık gözlemlenebilir.:

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

&& kısa devre yapıyor: Sağ kısım yalnızca sol kısım doğruysa değerlendirilir. İfadeyi akış yukarısına atayarak, ifadenin if ifadesinin dışında atanmasını önlersiniz. Bunun iyi bir uygulama olup olmadığı, ekibinizin koduna ve analiz araçlarına bağlıdır; anlamsal olarak doğrudur. En azından, vahşi doğada karşılaştığınızda kodun ne yaptığını bilmelisiniz.

PHP'nin bir "Walrus operatörüne" ihtiyacı yoktur çünkü atamalar zaten birer ifadedir. Bu, "ata ve test et" gibi deyimsel kalıpların (performanslı ve özlü) kullanılmasını mümkün kılar. Aynı zamanda, disiplin gereksinimleri de artar: parantezler, katı karşılaştırmalar, doğru/yanlış farkındalığı ve net ekip kuralları zorunludur. Bu yönergeleri izleyenler, ek bir dil özelliği gerektirmeden Walrus fikrinin faydalarından yararlanır.

Geri