PHP'de ternary operatorın hatalı kullanımı

12 Eylül 2008 Cuma - Unknown
"Ternary Operator" PHP'de sıkça kullanılan bir atama (assignment) yöntemidir.
If, else kod blokları içine kodumuza yazmak yerine çoğu zaman bu yöntemi kullanmak kod yazımını hızlandırıyor.

Örneğin if ve else kullanılarak şu şekilde yazılacak olan bir program parçacığı,

if($x==1){
$y=5;
}
else{
$y=10;
}

ternary operator kullanılarak

$y= ($x==1) ? 5 : 10;

olarak yazılabilir.

-----------------------------

Ben size karşılaştığım çok saçma bir ternary operator kullanımını ve bu kullanımı PHP interpretor'ın nasıl kabul ettiğini anlatmak istiyorum.

İlk bakışta aslında aşağıdaki kod problemli gözükmüyor.

$x != null ? $y = 3 : $y = 6;

Fakat bu kodu okurken birden içimde garip bir şeyler olduğuna dair şüphelere kapıldım :)

Ternary operator'ın ilk bölümünde atama yapılacak olan değişken bulunur. İkinci bölümde şart (condition), üçüncü ve dördüncü bölümlerde atanacak elementler yeralır.

Şimdi yukarıdaki kodu dikkatlice inceleyelim. Ternary operatorın ilk kısmını atanacak değişkenin oluşturması gerekir fakat bu kodda atanacak değişken yok. Direk olarak şart (condition) kısmı yazılmış. Üçüncü ve dördüncü kısımlarda ise direk olarak atama yapılmış.


Sanırım yazan kişinin kafası biraz karışıkmış bu kod parçacığını yazarken, dolayısıyla kullanımı tamamen baştan uydurmuş. Yeni sözdizimi (syntax) yaratmış.

$x != null ? $y = 3 : $y = 6;

yazarken, aslında şunu yazmaya çalışıyor:


$y = ($x != null) ? 3 : 6;

$x null değilse $y'yi 3 yap, yoksa 6 yap.

----------------------
Şimdi gelelim en önemli soruya.

Nasıl oluyor da PHP bu yanlış yazılmış kodu çalıştırıyor?

Şu şekilde yapıyor: $x!=null bölümünü çalıştırıyor, bu koşulu sağlıyorsa $x, soru işaretinden sonraki kısmı çalıştırıyor. Bu bölüm kendi içinde atama (assignment) içerdiği için, atama yapılmış oluyor ve $y değişkeni değişmiş oluyor. Bu yapılan işlemin sonucunu da (atama işlemi yani, sonucu boolean olarak true) ternary operatör'ün atanacak değişken kısmına yazmaya çalışıyor. Böyle bir değişken olmadığı için yazamıyor da :(

Ama garip olan şu ki, PHP interpretor bu satırı işleyip, bir aşağı satıra geçtiğinde; programcımızım istediği işlem - yani $y'ye atama yapma işlemi- mucizevi bir şekilde gerçekleşmiş oluyor.

Not: Sakın "Türkiye'de zaten böyle yazarlar php'yi" demeyin. Böylesine berbat yazılmış kodlara bu aralar en çok avrupadan gelen projelerde rastlıyorum.

1 yorum:

eburhan dedi ki...

adam (artık kim yazdıysa bunu) kulağı epey bi tersten göstermeye çalışmış. Çabasını takdir etmek lazım yine de :)