PHP’nin 5.1 sürümüyle birlikte “Standard PHP Library” (SPL) isimli bir kavram tanıtıldı. SPL içerisinde, PHP geliştiricilerinin çok kullanıldığına kanaat getirdikleri bir takım hazır tip ve fonksiyon tanımları mevcut. Bu tanımlar PHP bünyesinde servis edilerek, bir çok kütüphane ve yazılımcının bir standart üzerinden çalışmasına imkan veriyor. Ne yazık ki bir çok geliştirici SPL’den habersiz olarak geliştirme yapmaya devam ediyor.
PHP Manual’ın SPL ile ilgili bölümünü paste etmektense burada bir özet geçmek isterim.
Veri tipleri
SplStack: Bir array üzerinde array_pop, array_push dışında bir işlem yapmıyorsanız array alternatifidir.
SplQueue: Bir array üzerinde array_shift
, array_push
dışında bir işlem yapmıyorsanız array alternatifidir.
SplPriorityQueue: Bir array’e eklediğiniz elemanların önemlilik sıraları varsa ve bu elemanları array’i okurken her zaman önem sırasına göre almak istiyorsanız array alternatifidir.
SplFixedArray: Bir array’e ekleyeceğiniz eleman sayısını önceden biliyorsanız array alternatifidir.
Iteratorler
DirectoryIterator: Bir dizin içeriğini okur.
LimitIterator: Başka bir iterator’un belirli eleman aralığını kullanır. (İlk 5 eleman gibi)
Interfaceler
Countable: Sınıfın count
fonksiyonu ile sayılabilir olmasını sağlar.
Serializable*: Sınıfın serialize
ve unserialize
fonksiyonlarıyla çalışabilmesini sağlar.
ArrayAccess*: Sınıfın array gibi davranmasını, oluşan nesnenin $nesne[‘eleman’]
biçiminde erişimini sağlar.
Traversable*: Sınıfın foreach ile dolaşılabileceği bilgisidir. Iterator
veya IteratorAggregate
ile birlikte kullanılır.
Iterator*: Sınıfın foreach
ile dolaşılabilmesini sağlar.
IteratorAggregate: Yine sınıfın dolaşılabilmesini sağlayan bir iterator sınıfına sahip olduğunu belirtir.
Design Pattern yardımcıları
SplObserver: Observer design pattern’deki gözetleyen ve güncellemeleri alan sınıf interface’i.
SplSubject: Observer design pattern’de gözeticilerin abone oldukları sınıf interface’i.
Fonksiyonlar
iterator_to_array: Elinizdeki bir iterator’ı foreach’le dönmeksizin array’e dönüştürür.
iterator_apply: Bir iterator’ın her elemanı için parametre olarak verdiğiniz fonksiyonu çalıştırır.
iterator_count: count
ile sayamadığınız bir iterator’ın eleman sayısını verir.
Exceptionlar
Kendi Exceptionlarınızı yalnızca Exception
sınıfından değil, bir çok yer sınıftan türetebilir böylece istisnai durumları yakalarken daha net tip ayrımlarında bulunabilirsiniz. Hatta benim önerim, PHP gibi interpreter tabanlı, runtime’ı request-response ile sınırlı (tek tüketimlik) bir ortam için mümkün olduğunca mevcut sınıfları kullanın. SPL’nin önemi de bu noktada belirginleşiyor zaten. Exceptionların anlamlarını teker teker yazmak isterdim ama isimleri zaten yeterince açıklayıcı, burada önemli olan bu Exceptionların inheritance yapısı, o da şu şekilde:
Son olarak, kesin bir çizgi olmamakla birlikte, ben kendi yorumumca: LogicException
‘ı kullanıcı/programcı tarafından yanlış bir işlem yapıldığında, RuntimeException
‘ı ise bir işlem gerçekleştirirken bir zorluk oluştuğunda kullanıyorum. ErrorException
zaten PHP’nin hata oluştuğunda kullandığı özel bir sınıf.