一个变量的多个类型转换

时间:2011-12-01 17:08:22

标签: php types

有没有办法将变量强制为多种类型之一?

类似的东西:

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

提前致谢!

4 个答案:

答案 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
}

另一种方法是使功能超载并拥有大量的副本。