有没有办法将变量强制为多种类型之一?
类似的东西:
class MyClass
{
public function __construct(YourClass or TheirClass $incomingObject)
{
if($incomingObject instanceof YourClass){
echo 'Im your class';
}else{
echo 'You\'re mine class';
}
}
public function helloWorld(YourClass or TheirClass or RandomClass $greetable)
{
echo 'something..';
}
}
提前致谢!
答案 0 :(得分:3)
您无法按照描述进行操作。你必须这样做:
public function __construct($incomingObject)
{
if($incomingObject instanceof YourClass){
echo 'Im your class';
}else if ($incomingObject instanceof TheirClass){
echo 'You\'re mine class';
}else{
throw new InvalidArgumentException();
}
}
答案 1 :(得分:2)
不,类型提示不允许这样做。您必须使用instanceof
运算符在运行时自行完成测试。
你不会在这里陈述你的目标,但通常在PHP中根本不需要这样做。如果你打算在对象上调用方法,并且参数不是"正确的"那么PHP无论如何都会给你一个运行时错误。
这实际上会做一些有意义的事情的唯一情况是,如果你有两个完全不相关的类,它们具有相同名称的方法或属性,并且你传递一个实例(它没有被注释用于{{1而不是另一个的实例(即)。但那必须是罕见的事件。
答案 2 :(得分:2)
您应该为YourClass
定义一个接口,然后将所有类传递给任何支持该接口的类。然后在界面而不是类中键入提示。
interface IYourClass{
public function doStuff();
}
class YourClass implements IYourClass {
public function doStuff() {
return "This is a '".__CLASS__."'";
}
}
class MyClass {
public function __construct(IYourClass $object){
$this->message = $object->doStuff();
}
public function helloWorld() {
echo "Hello world! ".$this->message;
}
}
答案 3 :(得分:0)
您可以使用get_class()功能并在幕后进行检查:
public function helloWorld($greetable)
{
$type = get_class($greetable);
if ($type !== 'YourClass' || $type !== 'TheirClass' ... ) { /* Rejection */ }
// Do other stuff
}
另一种方法是使功能超载并拥有大量的副本。