PHP массивы только с одним типом - PullRequest
2 голосов
/ 20 июля 2009

Я хочу создать массив или список с элементами определенного типа (например, объекты, реализующие определенный интерфейс). Я знаю, что могу создать объект, который делает то же самое, реализуя Traversable и Iterator, или переопределить ArrayObject. Но, может быть, есть другой способ, который я пропустил.

Ответы [ 5 ]

4 голосов
/ 20 июля 2009

Вы имеете в виду что-то вроде:

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

Если нет, то извините, просто ваш вопрос не слишком ясен.

3 голосов
/ 20 июля 2009

Я написал бы пользовательский класс, который расширил бы ArrayObject и выдал исключение, если бы вы попытались присвоить переменную неправильного типа, на самом деле нет лучшего способа сделать это, о чем я могу подумать.

1 голос
/ 20 июля 2009

PHP как язык очень гибкий с точки зрения обработки типов и преобразования типов. Вам, вероятно, придется поставить ручную проверку, если вы хотите какую-либо строгую проверку типов, подойдет простой оператор if.

Объект массива разработан с учетом особой гибкости (ленивое назначение клавиш, автоматическое увеличение, строковые или целочисленные ключи и т. Д.), Поэтому вам, вероятно, следует использовать собственный объект.

0 голосов
/ 20 июля 2009

По сути, вы захотите создать функцию, которая проверяет, является ли переменная, которую вы вставляете в массив, объектом.

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

Если вы хотите убедиться, что у него есть определенное имя класса, вы должны сделать что-то вроде этого (для PHP5):

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

или это для предыдущих версий PHP:

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

Возможно, вы захотите заглянуть в array_filter () , чтобы сделать это без создания объекта.

Глядя на эту страницу, я обнаружил, что вы можете использовать array_filter с общими функциями, такими как is_object. Делая что-то вроде этого:

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

Будет ли фильтровать массив, чтобы он содержал только объекты.

0 голосов
/ 20 июля 2009

Вы можете использовать тип подсказки:

<?php

interface Shape
{
    function draw();
}

class MyArray
{
    private $array = array();

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

?>

Этот пример не идеален, но вы поймете идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...