【发布时间】:2016-06-11 05:08:38
【问题描述】:
这段代码运行良好。
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";
}
}
这会起作用。
【问题讨论】:
标签: php abstract-class overloading extend