我有一个类“集合”,其中有一个附加方法。 add方法应该只接受对象。因此,这是所期望的行为:

$x=5;//arbitrary non-object
$obj=new Foo; //arbitrary object

$collection=new Collection;
$collection->add($obj); //should be acceptable arg, no matter the actual class
$collection->add($x); //should throw an error because $x is not an object

根据PHP手册,可以通过与类名的作序$arg typehint方法。由于所有PHP类stdClass的孩子,我想这个方法的签名会工作:

public function add(stdClass $obj);

但是它失败“参数必须是stdClass的的实例”。

如果更改签名以通过我所定义的父类,则它的工作原理:

class Collection {
  public function add(Base $obj){
    //do stuff
  }
}

$collection->add($foo); //$foo is class Foo which is an extension of Base

有没有人知道如何为一个通用的对象类型暗示?

有帮助吗?

解决方案

不像Java的类Object,PHP的不具有用于物体的基类。对象不继承stdClass:这是一个默认的对象实现,而不是一个基类。所以,不幸的是,你不能在PHP中的所有对象键入提示。你要做的是这样的:

class MyClass {
    public function myFunc($object) {
        if (!is_object($object))
             throw new InvalidArgumentException(__CLASS__.'::'.__METHOD__.' expects parameter 1 to be object");
    }
}

幸运的是,PHP已经定义了用于该目的的InvalidArgumentException类。

其他提示

有PHP中没有根类。对象甚至不从stdClass继承:

class Foo {}
var_dump(new Foo instanceof stdClass); // bool(false)
var_dump(get_parent_class(new Foo));   // bool(false)

在PHP显然没有已知的方式来键入object暗示即使object是PHP中的数据类型(如array),和类型转换到object产生一个stdClass对象:

echo get_class((object) "string"); // stdClass

我想作为一种变通方法,你能告诉方法抛出异常或出现致命错误,如果is_object($obj)返回false。

好东西是,PHP仍然是一个动态语言,和类型提示只是:提示。我想你将不得不回落到老 is_object 或类似的方法并抛出定制异常。

class Collection {
  public function add(Base $obj){
    if(!is_object($obj))
    throw new Exception("Parameter must be an object");
    // do stuff
  }
}

在PHP 7.2现在有一个object类型的提示。你可以简单地做

class Collection {
  public function add(object $obj){
    //do stuff
  }
} 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top