typehinting:方法应该接受任何的$ arg是一个对象
-
26-09-2019 - |
题
我有一个类“集合”,其中有一个附加方法。 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
}
}
不隶属于 StackOverflow