在我的一些setter中,我传递了一个对象数组。我想确保它只包含给定类的实例。阅读文档,我就是这样做的:
class Foo
{
public function __construct()
{
}
}
class ErrorFoo
{
public function __construct()
{
}
}
$arrayObject = Array();
array_push($arrayObject, new Foo());
array_push($arrayObject, new Foo());
array_push($arrayObject, new ErrorFoo());
$error = false;
foreach ($arrayObject as $obj)
{
if ( $obj instanceof Foo )
{
echo "ok" . '<br>';
}
else
{
echo "error" . '<br>';
$error = true;
}
}
你知道比这样迭代数组更简单的方法吗?
答案 0 :(得分:3)
创建一个扩展ArrayObject
的类,重新定义其offsetSet()
方法并进行检查。使用此类而不是普通数组来存储Foo
类型的对象。
class ArrayOfFoo extends ArrayObject
{
public function offsetSet($index, $newval)
{
// Verify the input
if (! $newval instanceof Foo) {
// do something
throw new InvalidArgumentException('Invalid type');
}
// Let the parent class do its job
parent::offsetSet($index, $newval);
}
}
当类型ErrorFoo
的对象添加到数组时,此代码抛出异常:
$ArrayObject = new ArrayOfFoo();
$ArrayObject[] = new Foo();
$ArrayObject[] = new Foo();
// This throws an exception
$ArrayObject[] = new ErrorFoo();
ArrayObject
类的实例可以与使用array
相同的方式使用(设置,取消设置和从中获取值)。它的方法getArrayCopy()
可以用来获得一个array
,它可以作为参数传递给期望数组的函数(explode()
,f.e。)
答案 1 :(得分:0)
您可以使用array_map
或array_walk
:
https://php.net/manual/en/function.array-map.php
array_map示例:
function isInstanceOfFoo($n)
{
if(!($n instanceof Foo)) {
throw new Exception('Error');
}
}
$ArrayObject = Array();
array_push($ArrayObject, new Foo());
array_push($ArrayObject, new Foo());
array_push($ArrayObject, new ErrorFoo());
array_map(isInstanceOfFoo, $ArrayObject);
https://php.net/manual/en/function.array-walk.php
array_walk示例:
function isInstanceOfFoo($n, $k)
{
if(!($n instanceof Foo)) {
throw new Exception('Error');
}
}
array_walk($ArrayObject, isInstanceOfFoo);
答案 2 :(得分:0)
您可以使用变量来强制类型:
function doSomething(MyObject ...$array)
{
// $array contains only MyObject instances in it
}
doSomething(new MyObject, new MyObject, new MyObject);