3

我有一个类 '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);

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

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

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

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

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

4

4 回答 4

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为此目的定义了该类。

于 2010-11-18T19:32:27.617 回答
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 ,您可以告诉该方法抛出异常或死于致命错误。

于 2010-11-18T19:32:18.777 回答
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
  }
}
于 2010-11-18T19:32:19.527 回答
0

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

class Collection {
  public function add(object $obj){
    //do stuff
  }
} 
于 2018-05-29T11:11:21.653 回答