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

时间:2017-07-27 14:02:53

标签: php arrays object web collections

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

例如:在数组($ obj1,$ obj2)中,我需要检查这些对象的实例,它们是从哪个类创建的。

这里有一些代码:

Public Sub FW(olItem As Outlook.MailItem)

Dim olForward As Outlook.MailItem
Set olForward = olItem.Forward



    With olForward
        'Stuff happens here that work properly 
     End With

End If


'// Clean up
Set olItem = Nothing
Set olForward = Nothing

End Sub

或者也许:

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;
        }
    }

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

6 个答案:

答案 0 :(得分:0)

如果您使用数组(非对象)作为集合,那么除了检查数组项之外,您没有任何其他选择。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这就是我要做的:

if (in_array(get_class($object), $arrayToCheck)) {
    // Do your thing.
}

答案 3 :(得分:0)

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

<?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();
    }

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

使用数组过滤器:

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