我有一个abstract
班和孩子:
abstract class Cubique_Helper_Abstract {
abstract public function execute();
}
class Cubique_Helper_Doctype extends Cubique_Helper_Abstract{
public function execute($type) {}
}
如您所见,方法execute()
很常见。但是所有类中的参数数量可能不同。我怎样才能通过不同的方法论来保持这种扩展?
这是我当前的错误:
Declaration of Cubique_Helper_Doctype::execute() must be compatible
with that of Cubique_Helper_Abstract::execute()
谢谢你我前进。
答案 0 :(得分:3)
你可以用有限的论证来制作方法或功能。
function test(){
$num = func_num_args();
for ($i = 0;$i < $num;$i++)
{
$arg[$i] = func_get_arg($i);
}
// process on arguments
}
答案 1 :(得分:2)
您可以从摘要中删除execute()
,但您可能不希望这样做。
你也可以给它一个数据对象作为参数,如:
class MyOptions {
public function getType(){}
public function getStuff(){}
}
abstract class Cubique_Helper_Abstract {
abstract public function execute(MyOptions $options);
}
class Cubique_Helper_Doctype extends Cubique_Helper_Abstract{
public function execute(MyOptions $options) {
$type = $options->getType();
}
}
或者,你可以让它依赖于构造函数中的值并省略参数:
abstract class Cubique_Helper_Abstract {
abstract public function execute();
}
class Cubique_Helper_Doctype extends Cubique_Helper_Abstract{
public function __construct($type) {
// since __construct() is not in abstract, it can be different
// from every child class, which let's you handle dependencies
$this->type = $type;
}
public function execute() {
// you have $this->type here
}
}
最后一个选择是我最喜欢的。这样,你真的确保你有依赖关系,到了execute()
的时候,你不必给它任何参数。
我会不使用func_get_args()
,因为您忘记了依赖关系。例如:
class Cubique_Helper_Doctype extends Cubique_Helper_Abstract {
public function execute() {
$args = func_get_args();
$type = $args[0];
$title = $args[1];
$content = $args[2];
// do something, for example
echo $type; // will always echo "" if you miss arguments, but you really want a fatal error
}
}
$d = new Cubique_Helper_Doctype();
$d->execute();
// this is a valid call in php, but it ruins your application.
// you **want** it to fail so that you know what's wrong (missing dependencies)
答案 2 :(得分:1)
您可以使用func_get_arg,以便子类的方法签名相同。
答案 3 :(得分:1)
当参数数量不同时,您会收到错误:
Fatal error: Declaration of Cubique_Helper_Doctype::execute() must be compatible with that of Cubique_Helper_Abstract::execute() in C:\wamp\www\tests\41.php on line 16
所以你唯一的选择是让争论成为一个数组并传入实际的参数,或者在没有参数的情况下声明execute
并用func_get_args或{{3}来模拟发送的参数}和func_get_arg