sadece tek tip php diziler

5 Cevap php

Ben belli bir tür unsurları içeren bir dizi veya liste oluşturmak için arıyorum (örneğin belirli bir arabirim uygulamak nesneleri). Ben Traversable ve yineleyici uygulamanın aynı şeyi yapar bir nesne oluşturmak, ya da ArrayObject geçersiz biliyorum. Ama belki ben kaçırdım başka bir yol daha var.

5 Cevap

Ben ArrayObject genişletilmiş ve ben düşünüyorum ki bunu yapmak için iyi bir yol gerçekten var, doğru tip değildi bir değişken atamak için çalıştı, bir istisna attı özel bir sınıf yazmak istiyorsunuz.

Eğer böyle bir şey demek istiyorsun:

$array=Array();
foreach ($itemsToAdd as $item) {
    if ($item instanceof NameOfwantedInterface) {
     Array_push($array,$item);
    }
}

Bunu yapmazsanız, onları üzgünüm - bu soru çok net değil sadece.

Bir lanugage olarak PHP tip kullanım ve türü dönüştürme açısından çok esnektir. Muhtemelen güçlü tip denetimi her türlü, deyim yapacak eğer basit isterseniz de manuel kontrol koymak zorunda kalacaktır.

Dizi nesnesi (vb, tembel tuş atama, otomatik artış, dize veya tam sayı tuşları), özellikle esnek olacak şekilde tasarlanmıştır böylece muhtemelen kendi özel bir nesne kullanmanız gerekir.

Sen Tür Dayatma kullanabilirsiniz:

<?php

interface Shape
{
    function draw();
}

class MyArray
{
    private $array = array();

    function addValue(Shape $shape) //The hinting happens here
    {
    	$array[] = $shape;
    }
}

?>

Bu örnek, mükemmel değil, ama fikir alırsınız.

Temelde, sen diziye eklediğiniz değişken bir nesne olup olmadığını denetler bir işlevi yapmak istediğiniz için gidiyoruz.

function add($var)
{
    if(is_object($var))
    {
       $this->array[] = $var;
    }
}

Eğer belirli bir sınıf adı var emin olmak istiyorsanız, (PHP5 için) böyle bir şey yapardı:

function add(className $var)
{
   $this->array[] = $var;
}

veya bu önceki PHP sürümleri için:

function add($var)
{
    if($var instanceOf className)
     {
        $this->array[] = $var
     }
}

Bir nesneyi bina olmadan bunu yapmak için array_filter() içine bakmak isteyebilirsiniz.

Bu sayfada baktığımızda, seni is_object gibi genel fonksiyonlar ile array_filter kullanabileceğiniz bulduk. Yani böyle bir şey yapıyor:

$this->array = array_filter($this->array ,'is_object');

Sadece nesneleri içeren bir dizi filtre olur.