如何检查数组是否是特定对象的集合?



在我的类中,我有一个期望作为数组的方法,并且该数组应根据集合类型以不同的方式使用。数组项应该是对象,我需要知道这些对象是哪个类实例。

例如:在 array($obj 1, $obj 2( 中,我需要检查这些对象的实例,它们是从哪个类创建的。

这里有一些代码:

public function convertDataToInsert($data)
{
if (is_array($data)) {
foreach ($data as $obj) {
if ($obj instanceof CriterioDigital) {
//Ok, an array of CriterioDigital
} elseif ($obj instanceof ArquivoDigital) {
//Ok, an array of ArquivoDigital
} else {
throw new Exception('Invalid parameter');
}
break;
}
}

或者也许:

public function convertDataToInsert($data)
{
if (is_array($data)) {
$obj = $data[0];
if ($obj instanceof CriterioDigital) {
//Ok, an array of CriterioDigital
} elseif ($obj instanceof ArquivoDigital) {
//Ok, an array of ArquivoDigital
} else {
throw new Exception('Invalid parameter');
}
}
}

我只需要检查这个数组的集合类型。我知道我可以迭代它,但是 php 中有什么更好的方法可以这样做吗?

使用数组过滤器:

if (count(array_filter($data, function ($entry) {
return !($entry instanceof CriterioDigital);
})) > 0) {
throw new DomainException('an array of CriterioDigital must be provided');
}

一位同事向我展示了一种简单的方法来检查数组是否只包含一个类的实例:

class A {}
class B {}
class C extends A {}
$tests = [
1 => [new A(), new A()], // succeeds
2 => [new A(), new B()], // fails
3 => [new C(), new C()], // succeeds, because C extends A
];
foreach ($tests as $index => $collection) {
try {
array_map(static function (A $object): void {}, $collection);
} catch (TypeError $e) {
// Implement your error handling here.
}
}

下面是一个带有输出的示例:https://3v4l.org/1IVg9

如果您使用数组(而不是对象(作为集合,那么除了检查数组项之外,您别无选择。

检查实例意味着遍历每种类型,直到找到正确的类型。相反,请尝试get_class($object)并使用 switch 语句来确定下一步该做什么。

或者,使用getWhateverYouNeed()方法创建一个接口,并在每个相关对象类型中实现它。这样,每个对象,无论什么都是GetWhateverYouNeedInterface的实例。查找"策略模式"。

还有另一种方法可以实现此目的:

<?php // ConvertibleDataCollection.php
abstract class ConvertibleDataCollection
{
protected $data = [];
public function setData($data)
{
$this->data = $data;
}
public function getData()
{
return $this->data;
}
abstract public function convert();
}
<?php // CriterioDigitalCollection.php
class CriterioDigitalCollection extends ConvertibleDataCollection
{
public function convert()
{
}
}
<?php // ArquivoDigitalCollection.php
class ArquivoDigitalCollection extends ConvertibleDataCollection
{
public function convert()
{
}
}

然后在你的课堂上:


public function convertDataToInsert(ConvertibleDataCollection $dataCollection)
{
return $dataCollection->convert();
}

最新更新