Bir dizi olarak bir nesne kullanarak

2 Cevap php

PHP son güncellemeler, onlar bir nesne vb ArrayAccess, Iterasyon, sayılabilir, gibi bir dizi olarak tedavi edilmesi için izin çeşitli arayüzler eklendi

Benim sorum sonra aşağıdaki çalışması gerektiğini mantıklı olur, bir:

function useArray(array $array)
{
    print_r($array);
}

useArray(new ArrayObj(array(1,2,3,4,5));

Şu an itibariyle, PHP $array teknik bir dizi değil gibi, bir tür-ima hata atar. Ancak, bir dizi temelde özdeş kılan tüm arabirimleri uygulayan.

echo $array[0]; // 1
$array[0] = 2;
echo $array[0]; // 2

Mantıken, nesne bir dizi olarak aynı arayüzü uygulayan gibi, bir dizi kullanılır her yerde kullanılabilir gerekir.

Benim mantık karıştı, ya da bir nesne, bir dizi olarak aynı arayüzü uygulayan varsa, hepsi aynı yerlerde kullanılmak üzere mümkün olması gerektiğini mantıklı mı?

2 Cevap

Am I confused in my logic, or does it makes sense that if an object implements the same interface as an array, it should be able to be used in all the same places?

not bir nesne - - gibi herhangi arabirimleri uygulamak değil, bir array özel bir PHP değişken türüdür. ArrayObject (Countable, ArrayAccess, vs) çok sayıda arabirim uygulayan bir tam teşekküllü bir amacı, ve (bazı durumlarda, bir dizi gibi hareket için bir cisim sağlar ) bir foreach döngü gibi. Onlar aynı arabirimleri uygulayan yok iken bu yüzden sometimes aynı davranır.

PHP çok fonksiyonlu imza desteklemek için ideal bir çözüm olacaktır:

function useArray(array $array) { }
function useArray(ArrayObject $array) { }

Ama biz (biz hiç o olsun eğer) sadece fonksiyon tanımının dışında değişken türlerini kontrol etmek gerekir ki elde edene kadar:

function useArray($array) {
 if (is_array($array) || $array instanceof ArrayObject) {
   // Do some stuff
 } else {
   throw new Exception('I require an array or an array-like structure!');
 }
}

Ya $array argümanı ile array-türü şeyler yapmak ve useArray oluşturabilir diye herhangi bir uyarı / hataları işlemek için deneyin.

Sizin tipi ima kendi türünde "dizi" belirten ancak bir "ArrayObj" in geçiyor

function useArray(array $array)
...
useArray(new ArrayObj

Yani evet onun şikayet edeceğim.

Am I confused in my logic, or does it makes sense that if an object implements the same interface as an array, it should be able to be used in all the same places?

Nesne başka bir sınıf olarak aynı arayüzü uygulayan varsa, evet, senin yazın dayatarak hakkında şikayette derleyici için hala geçerli birbirinin yerine kullanabilirsiniz, ancak onun değil aynı tip beri.

Iki nesne aynı arayüzü uygulayan sadece onlar çünkü aynı türden olduğu anlamına gelmez.