2010-11-18 58 views
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 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 

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

+0

'assert(is_object($ arg));'是你所需要的。 – mario 2010-11-18 21:58:47

回答

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

针对'InvalidArgumentException'的+1。请注意,只有在SPL加载时才可用。 – BoltClock 2010-11-18 19:41:24

+1

您也可以在异常字符串中写入__METHOD__而不是MyClass :: myFunc。 – BoltClock 2010-11-18 19:42:08

+0

是的。幸运的是,从5.0.0开始默认加载SPL。我看不出为什么有人会禁用它,它非常有用。 – netcoder 2010-11-18 19:43:29

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 
    } 
} 
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死亡。

+0

我想你可以实例化stdClass,它必须是所有对象的基类。每天学些新东西。我想知道为什么PHP决定这样做。 – dnagirl 2010-11-18 19:37:55

相关问题