为函数中的参数设置多个实例类型

Setting multiple instance types for an argument in a function

我已经对此进行了一些谷歌搜索,但似乎找不到太多帮助。但是,我想知道是否有一种方法可以检查函数中参数的多个实例类型,例如检查它是 User 模型还是另一个模型的实例,如果它是两者之一,则允许它通过。如果不是,则抛出错误。我正在使用 PHP 和 Laravel.

这里的用例是我正在将数据库从 SQL 迁移到 Mongo,因此在过渡期间我将有两个用户模型(UserMongoUser) 并且我想检查每一个以确定参数是否是某种形式的 User 实例。

public function setTo(User $user)
    {
        $this->user()->associate($user);

        return $this;
    }

不得已,我可以复制功能,但这似乎是不必要的重复。而且我宁愿不完全删除实例检查。

我想知道有没有办法实现这个?如果没有,我很想听听人们对一般处理此问题的最佳方法的看法。

谢谢!

您可以执行以下操作:
让 classes(User 和 MongoUser)都扩展一个基础 class(UserBase??)并检查它。

<?php

class base {
}

class A extends base {
}

class B extends base {
}

class C {
}

function test(base $x) {
    var_dump($x);
}


test(new base()); // good
test(new A());  // good
test(new B());  // good
test(new C());  // throws error because class C doesn't extend base class

另一种可能性是省略 method-declaration 中的限制并进行手动测试:

public function setTo($user)
{
    if($user instanceof User || $user instanceof MongoUser) {
        echo "is an instance of User or MongoUser";
        $this->user()->associate($user);

        return $this;
    } else {
       // throw an erorr
    }
}