在我的类中,我有一个期望为数组的方法,并且根据集合类型应该使用不同的数组。数组项应该是对象,我需要知道这些对象是哪个类实例。
例如:在数组($ 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中这样做?
答案 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');
}