2016-02-28 50 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"; 
    } 
} 
相关问题