我正在寻找使用某种类型的元素创建数组或列表(例如,实现某个接口的对象)。我知道我可以创建一个对象来实现Traversable和Iterator,或者覆盖ArrayObject。但也许我错过了另一种方式。
答案 0 :(得分:4)
你的意思是:
$array=Array();
foreach ($itemsToAdd as $item) {
if ($item instanceof NameOfwantedInterface) {
Array_push($array,$item);
}
}
如果你不这样做,我很抱歉 - 这只是你的问题不太清楚。
答案 1 :(得分:3)
如果你试图分配一个不正确类型的变量,我会编写一个扩展ArrayObject的自定义类并抛出异常,实际上没有更好的方法可以解决这个问题。
答案 2 :(得分:1)
PHP作为语言在类型处理和类型转换方面非常灵活。如果你想要任何类型的强类型检查,你可能需要手动检查,一个简单的if语句就可以了。
数组对象的设计特别灵活(延迟键分配,自动增量,字符串或整数键等),因此您应该使用自己的自定义对象。
答案 3 :(得分:0)
您可以使用类型提示:
<?php
interface Shape
{
function draw();
}
class MyArray
{
private $array = array();
function addValue(Shape $shape) //The hinting happens here
{
$array[] = $shape;
}
}
?>
这个例子并不完美,但你会明白这一点。
答案 4 :(得分:0)
基本上,您将要执行一个函数来检查您插入到数组中的变量是否为对象。
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');
会过滤数组以仅包含对象。