2008-09-28 9 views
6

Gerekli tüm SPL arayüzlerini uygulayarak gerçek bir PHP dizisinden neredeyse ayırt edilemeyen bir sınıf yazmak mümkün müdür? Kritik olan bir şey eksik mi?PHP'nin SPL'si: Dizileri içeren arayüzleri tüm dizi özelliklerini kapsıyor mu?

Daha gelişmiş bir Array nesnesi oluşturmak istiyorum, ancak bunları özel bir Array sınıfı ile değiştirdiğimde her yerde diziler kullanan mevcut bir uygulamayı kırmayacağından emin olmak istiyorum.

cevap

7

Düşünebildiğim tek sorun, gettype() ve is_array() işlevleridir. Kısa süre önce bir dizi gibi nesneyi kullanabilirsiniz rağmen, yine de bir nesne olarak tanımlanır Çünkü

gettype($FakeArray) == 'array' 
is_array($FakeArray) 

için kodunuzu kontrol edin .

+2

O zaman bile görünüyor. – Wilco

3

Diğer farklılıklar arasında, diziler için '+' operatörü (birleştirme) ve yaygın olarak kullanılan array_merge ve array_shift da dahil olmak üzere tüm array_* işlevlerinin başarısızlığı bulunur.

4

Yukarıda belirtilen noktalara ek olarak, kullanıcı alanı dizisi türü ipuçlarının, sınıfınızın örnekleriyle çalışmasını sağlayamazsınız. Örneğin:

<?php 
function f(array $a) { /*...*/ } 

$ao = new ArrayObject(); 
f($ao); //error 
?> 

Çıktı: Ben ek durumlarından sorumlu olacak bu işlevleri geçersiz kılmak için override_function() işlevini varmış gibi

Catchable fatal error: Argument 1 passed to f() must be an array, object given