我想在我的PHP類中使用函數多態性。我打算爲我的一些子類功能檢查一個函數的輸入類型。PHP函數多態性
class A
{
public function setValue(Type $value)
{
}
}
class B extends A
{
public function setValue(XType $value)
{
}
}
class C extends A
{
public function setValue(ZType $value)
{
}
}
$b = new B();
$b->setValue(new XType());
與
class Type {};
class XType extends Type;
class ZType extends Type;
我找的行爲是PHP拋出一個異常,如果的setValue被稱爲與錯誤的參數類型。
如果我使用上面的代碼,我得到一個錯誤:
Runtime Notice: Declaration of B::setValue() should be compatible with A::setValue(Type $value) in B.php line ..
這是我設法獲得我想要的行爲:
class B extends A
{
public function setValue(Type $value)
{
if (!$value instanceof XType) {
throw new \Exception("value $value not allowed, should be of type XType");
parent::setValue($value);
}
}
}
但我會很高興讓PHP核心句柄那位代碼對我來說:)
我看到我是不是夠清楚了..
我試圖給調用者提供默認行爲,A :: setValue(),以及關於某些子類的具體行爲,所以如果調用者試圖調用B :: setValue方法()與不支持的類型,它會得到一個錯誤,但如果它調用,讓我們說,d :: setValue方法(),它會得到默認,A :: setValue方法() 。
你有什麼問題嗎? – eisberg
哈哈,是的!我想知道是否有辦法實現我在不使用instanceof部件的情況下獲得的相同行爲:) –
方法參數類型是逆變的。 – phant0m