Вы можете удалить 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)