2016-02-28 74 views
2

此代碼運行良好。必須聲明子類方法是否與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"; 
    } 
} 

這會奏效。

回答

1

PHP manual

當從一個抽象類繼承,所有的方法標誌着父類聲明抽象必須由孩子來定義;另外,這些方法必須用相同(或更少限制)的可見性來定義。

此外,方法的簽名必須匹配,即類型提示和所需參數的數量必須相同。

因此,父類有0個參數,孩子有2個需要個。那就是問題所在。但是因爲您改變了您的代碼,正如您所說:

子方法已將所有3個參數都設爲默認值。

您將子類中所需參數的數量減少爲0.所以它現在可以工作。

重演。 這是錯誤的:

abstract class MyAbstractClass 
{ 
    abstract public function _myFunction(); // No parameters required 
} 

class Foobar extends MyAbstractClass 
{ 
    public function _myFunction(A $a, A $b, A $c = null) // Two parameters required 
    { 
     echo "abc"; 
    } 
} 

這也將是錯誤的:

abstract class MyAbstractClass 
{ 
    abstract public function _myFunction(A $a, A $b, A $c); // Three parameters required 
} 

class Foobar extends MyAbstractClass 
{ 
    public function _myFunction(A $a, A $b) // Two parameters required 
    { 
     echo "abc"; 
    } 
} 

這是正常的:

abstract class MyAbstractClass 
{ 
    abstract public function _myFunction(); // No parameters required 
} 

class Foobar extends MyAbstractClass 
{ 
    public function _myFunction(A $a = null, A $b = null, A $c = null) // No parameters required 
    { 
     echo "abc"; 
    } 
} 

而這也沒關係:

abstract class MyAbstractClass 
{ 
    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"; 
    } 
} 
相關問題