为函数中的参数设置多个实例类型
Setting multiple instance types for an argument in a function
我已经对此进行了一些谷歌搜索,但似乎找不到太多帮助。但是,我想知道是否有一种方法可以检查函数中参数的多个实例类型,例如检查它是 User 模型还是另一个模型的实例,如果它是两者之一,则允许它通过。如果不是,则抛出错误。我正在使用 PHP 和 Laravel.
这里的用例是我正在将数据库从 SQL 迁移到 Mongo,因此在过渡期间我将有两个用户模型(User
和 MongoUser
) 并且我想检查每一个以确定参数是否是某种形式的 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
}
}
我已经对此进行了一些谷歌搜索,但似乎找不到太多帮助。但是,我想知道是否有一种方法可以检查函数中参数的多个实例类型,例如检查它是 User 模型还是另一个模型的实例,如果它是两者之一,则允许它通过。如果不是,则抛出错误。我正在使用 PHP 和 Laravel.
这里的用例是我正在将数据库从 SQL 迁移到 Mongo,因此在过渡期间我将有两个用户模型(User
和 MongoUser
) 并且我想检查每一个以确定参数是否是某种形式的 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
}
}