Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:确保数组只包含某个类中的对象_Php_Arrays_Class - Fatal编程技术网

PHP:确保数组只包含某个类中的对象

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

在我的一些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;  
    }
}
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实例。