PHP:确保数组只包含某个类中的对象
在我的一些setter中,我传递一个对象数组。我想确保它只包含来自给定类的实例。阅读这份文件,以下是我所做的:PHP:确保数组只包含某个类中的对象,php,arrays,class,Php,Arrays,Class,在我的一些setter中,我传递一个对象数组。我想确保它只包含来自给定类的实例。阅读这份文件,以下是我所做的: class Foo { public function __construct() { } } class ErrorFoo { public function __construct() { } } $arrayObject = Array(); array_push($arrayObject, new Foo()); arr
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;
}
}
class-Foo
{
公共函数构造()
{
}
}
类错误foo
{
公共函数构造()
{
}
}
$arrayObject=Array();
array_push($arrayObject,new Foo());
array_push($arrayObject,new Foo());
array_push($arrayObject,newerrorfoo());
$error=false;
foreach($arrayObject作为$obj)
{
如果($obj instanceof Foo)
{
回显“ok”。
;
}
其他的
{
回显“错误”。“
”;
$error=true;
}
}
你知道比像这样迭代数组更简单的方法吗 您可以使用
array\u map
或array\u walk
进行以下操作:
数组映射的示例:
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);
数组_walk的示例:
function isInstanceOfFoo($n, $k)
{
if(!($n instanceof Foo)) {
throw new Exception('Error');
}
}
array_walk($ArrayObject, isInstanceOfFoo);
创建一个扩展的类,重新定义它的方法并签入它。使用此类而不是普通数组来存储
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();
类的实例可以以与使用相同的方式使用(设置、取消设置和从中获取值)。它的方法可用于获取一个变量,该变量可作为参数传递给需要数组的函数(
explode()
,f.e.)您可以使用变量强制类型:
function doSomething(MyObject ...$array)
{
// $array contains only MyObject instances in it
}
doSomething(new MyObject, new MyObject, new MyObject);
不确定是否总是设置
$error=true
help.oups,更正作为setter函数的一部分,您可以验证传递的对象类型吗?如果类型与所需类型不匹配,则引发异常。这样做将确保在任何getter中返回的对象都是预期的类型。@Goon3r如果我将数组作为参数传递,那么传递的对象类型是array,否?链接是/de/而不是/en/无法编辑,因为它至少需要6个字符。您可以扩展它来传递类名-因此成为函数isInstanceOf($class,$n)
,测试变成$class的$n实例。