Diğer programlama dillerinin PHP’yi küçük görmek isteyen takipçilerinin dayandıkları en öne çıkan argümanlardan biri de PHP yorumlayıcısının loosely typed yapıyı ele alış biçimi. Gerçekten de bir değişkeni integer olarak kullanmaya başlayıp, daha sonra kod içinde bir yerlerde tür dönüşümü yapmaksızın string’e çevirip, nihayeten aynı değişkeni array olarak kullanmak yalnız PHP’de mümkün değilse de, genellikle PHP programcılarının sahip olduğu bir kötü alışkanlık.
Doğal olarak böylesi alışkanlık beklenmedik hataları da beraberinde getirmeye amade. PHP yorumlayıcısının nelere kadir olduğunu(!) görmek açısından şu örneğe göz atalım:
1 2 3 4 5 6 7 8 9 10 | <?php header('Content-Type: text/html; charset=utf-8'); $kunk = 'Künk'; $sifir = 0; if ($kunk == TRUE && $sifir == FALSE && $kunk == $sifir) { echo 'Benim adım da bundan sonra Maykıl Ceksın olsun!'; } |
Yukarıdaki kodu üşenmeden kopyalayıp çalıştırın. Bakalım ne oluyor? Ne, $kunk TRUE, $sifir FALSE ve buna rağmen $kunk ile $sifir birbirine eşit, öyle mi? PHP yorumlayıcısı öyle diyor!
Tabii burada
1 | if ($kunk == TRUE && $sifir == FALSE && $kunk == $sifir) |
ile eşitlik kontrol etmek yerine
1 | if ($kunk == TRUE && $sifir == FALSE && $kunk === $sifir) |
ile özdeşlik kontrol ederek bu dertten kurtulabiliriz, ancak bu tür sorunlar deneyimsiz ya da kötü alışkanlıklar edinmiş PHP programcılarının başına çok sık gelir ve bu arkadaşlar sorunun kaynağını bulana kadar gereksiz vakit yitirirler.
Öte taraftan, kişisel fikrimce kullandığım programlama dili, bana kullandığım değişkenlerin türleri üstünde de tam hakimiyet sağlayabilmeli.
PHP5′ten itibaren, nesneler ve array’ler üstünde bu hakimiyete sahibiz. PHP6 yol haritası bu konuda daha umut verici görünüyor, ancak geliştiriciler bir türlü kendi aralarında anlaşamadıklarından (http://news.php.net/php.internals/47120) PHP6, gün itibarıyla trunk deposundan kaldırılmış durumda ve bir daha ne zaman geri konulacağı ya da ne zaman kararlı PHP6 sürümü çıkacağı meçhul.
Öyleyse, değişkenlerimizi belirli bir türden (integer, string, float vb) olmaya zorlamak için ne yapabiliriz?
Bildiğim bir-iki yöntem var: İlki, Ilia Alshanetski’nin yayınladığı bir yamayı kullanarak PHP’yi yeniden derlemek.
İkincisi ve bu yazının konusu, PECL deposunda bulunan SPL_Types eklentisi. Bu eklenti sayesinde PHP ile değişkenleri istediğimiz türden olmaya zorlayabiliyoruz.
Önce SPL_Types eklentisini kurmamız gerekiyor. Aşağıda anlattığım kurulum Ubuntu 9.10 için geçerli ancak adam gibi işletim sistemlerinin hemen hepsinde adımlar çok benzer olmalı.
Konsola geçiyoruz. Önce iki satır “export” yapmamız gerekiyor:
1 2 | export LC_ALL="C" export LANG="C" |
Üstteki iki satır olmadan pecl sorun çıkarıyor. Şimdi eklentiyi kurabiliriz:
1 | sudo pecl install http://pecl.php.net/get/SPL_Types-0.3.0.tgz |
…ve Apache’yi yeniden başlatıyoruz.
1 | sudo service apache2 restart |
Artık yeni eklentimizi deneyebiliriz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php $int = new SplInt(42); try { $int = 'Değişkeni stringe çevirmeyi deneyelim'; } catch (UnexpectedValueException $uve) { echo $uve->getMessage() . PHP_EOL; } var_dump($int); echo $int; |
Bu kodu çalıştırdığımızda aldığımız çıktı şöyle:
1 2 3 4 5 6 | Value not an integer object(SplInt)#1 (1) { ["__default"]=> int(42) } 42 |
SPL_Types, SplInt yanında SplFloat, SplEnum, SplBool ve SplString nesneleriyle float, enum, boolean ve string değişken türlerini de destekliyor. Biz de kullandığımız, sevdiğimiz, ayrılmak istemediğimiz güzel PHP’mize biraz daha hakim olmanın verdiği tatmin hissiyle kodumuzu yazmaya devam ediyoruz.





