此代碼運行良好。必須聲明子類方法是否與PHP中的父類方法兼容?
ParentClass
是抽象類。我想我可以通過
$class = new ReflectionClass('ParentClass');
$methods = $class->getMethods(ReflectionMethod::IS_ABSTRACT);
這說明了幾個方法,其中一個被命名爲methodA
驗證。
這裏來真正把我難倒了:
有一個ChildClass
,這是一個具體的類並實現抽象方法methodA
之一。使用
$method = new ReflectionMethod('ChildClass', 'methodA');
var_dump($method->getParameters());
我可以驗證有3個參數。因爲我知道代碼運行良好。我用同樣ReflectionMethod驗證ParentClass
$method = new ReflectionMethod('ParentClass', 'methodA');
var_dump($method->getParameters());
此輸出一個空數組,其指示無參數,我想。
爲什麼?可悲的是,我不能看這些類的源代碼,但我一直在試圖找出這個沒有太多進展:
到目前爲止,我只能做這樣的事情。代碼是PHP5.4。我真的無法弄清楚如何抽象方法_myFunction
沒有參數,但具體的子類方法與3個參數。 PHP使用__call
來超載,但這是更多的extending
問題,我想。
class A {}
abstract class MyAbstractClass
{
//abstract public function _myFunction();// ERROR
abstract public function _myFunction(A $a, A $b, A $c);
}
class Foobar extends MyAbstractClass
{
public function _myFunction(A $a, A $b, A $c = null)
{
echo "abc";
}
}
$a = new Foobar();
$a->_myFunction(new A(), new A(), new A());
$a->_myFunction(new A(), new A());
//output: abcabc without error
補充:
寫下來的問題後,它幫助我繼續我的測試,我想我知道爲什麼了。子方法已將所有3個參數都設爲默認值。
class Foobar extends MyAbstractClass
{
public function _myFunction(A $a = null, A $b = null, A $c = null)
{
echo "abc";
}
}
這會奏效。