类型提示:方法应该接受作为对象的任何$ art

时间:2010-11-18 19:26:04

标签: php oop php-5.3 type-hinting

我有一个'Collection'类,它有一个add方法。 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前面添加类名来输入提示方法。由于所有PHP类都是stdClass的子类,我认为这种方法签名可行:

public function add(stdClass $obj);

但它失败了“Argument必须是stdClass的一个实例”。

如果我将签名更改为我定义的父类,那么它可以工作:

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

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

有谁知道如何为通用对象键入提示?

4 个答案:

答案 0 :(得分:5)

与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类。

答案 1 :(得分:4)

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,您可以告诉该方法抛出异常或死亡致命错误。

答案 2 :(得分:0)

那就是,PHP仍然是一种动态语言,类型提示只是:提示。我认为你将不得不回到旧的is_object或类似方法并抛出一个自定义异常。

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

答案 3 :(得分:0)

在PHP 7.2中,现在有一个class Collection { public function add(object $obj){ //do stuff } } 类型提示。你可以简单地做

NULL