2010-11-18 60 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

相關問題