Nesne örneği dizi türü argüman olarak geçirilebilir ki PHP arayüzü gibi uygulamak?

3 Cevap php

PHP onlar Tür Dayatma diyoruz rağmen argüman türlerini belirtmek mümkündür.

Ben işlevlerinden biri bağımsız değişken türü olarak bir dizi belirten bir arabirim uygulama ediyorum:

function myFunction(array $argument){
}

Ben bir sınıf tanımlamak istiyorum, bir örneği bu işlev için bağımsız değişken olarak kullanılabilir. Diğer bir deyişle ArrayObject uzatmak veya ArrayAccess veya bu satırlar boyunca bir şey uygulamak.

Bunun için çalışacak bir arayüz veya soyut sınıf bir orada inşa edilmiştir? (DiziNesnesi yok)

3 Cevap

Yok, ama ben iki seçenek öneririm:

  1. array belirtici kaldırmak ve yerine is_array kullanarak işlev içinde ve DiziNesnesi instanceof kontrol
  2. Rutin veya 1 parçası olarak çağrılırken (array) $ ArrayObject kullanın. Yukarıda.

soulmerge :-) için örnek

function myFunction(array $argument){
    echo var_export($argument,true);
}
$a = new ArrayObject();
$a[] = 'hello';
$a[] = 'and goodbye';

myFunction((array)$a);

çıkışlar

 array (
   0 => 'hello',
   1 => 'and goodbye',
 )

This isn't possible. array() is not an object of any class. Hence, it can't implement any interface (see here). So you can't use an object and an array interchangeably. The solution strongly depends on what you'd like to achieve.

Neden izin işlevi imza değiştirmek gerekmez, sadece ArrayObject s ArrayIterator s ArrayAccess s IteratorAggregate s {[ (4)]} s veya Traversable s (Eğer işlev içinde yapmak istiyorum ne bağlı olarak)?

Eğer ipucu olarak Traversable kullanmalısınız geçirilen nesne interation-yeteneklerine güvenmek zorunda. Bu nesne foreach() ile kullanılabilir sağlayacaktır. Eğer nesneye dizi gibi anahtar erişim gerekiyorsa (örneğin, $test['test']) size ipucu olarak ArrayAccess kullanmalısınız. Eğer belirli bir özel tipte olmaları geçirilen nesne gerekiyorsa, ipucu olarak özel türünü kullanın.

Başka bir seçenek hiç bir tip-ipucu kullanımı ve işlevi bünyesinde geçirilen argümanın türünü belirlemek ve buna argüman işlemek (veya InvalidArgumentException veya böyle bir şey atmak) değil olacaktır.

if (is_array($arg)) { ... }
else if ($arg instanceof Traversable) { ... }
else if ($arg instanceof ArrayAccess) { ... }
else {
    throw new InvalidArgumentException('...');
}

Dizi PHP ilkel bir tür olduğu gibi Hayır, bu mümkün değildir. Bir sınıfın örneği bir nesnedir, ve PHP-iç karşılaştırma zaten bu noktada (arabirimler ve benzeri kontrol edilmez) durur.

Size nesne dışında bir dizi oluşturabilirsiniz:

$array = array();
foreach ($yourObject as $key => $value) {
    $array[$key] = $value;
}