我觉得现在做你想做什么的唯一方式是:
class MyHelloWorld extends Base {
use SayWorld {
SayWorld::__construct as private __swConstruct;
}
public function __construct($a, $b, $c = 0)
{
$this->__swConstruct($a, $b, $c);
}
}
编辑2:
我的建议基于一年以上的特质处理s是:避免在所有的特性中编写构造函数,或者如果您必须 - 至少使它们无参数。具有它们的特质违背了一般构造函数的概念,即:构造函数应该特定于它们所属的类。其他的进化高级语言甚至不支持隐式的构造函数继承。这是因为构造函数与类和其他方法的关系要强得多。事实上他们有很强的关系,即使是LSP也不适用于他们。 Scala语言中的特性(非常成熟和友好的Java继承者),can't have a constructor with parameters。
编辑1:
有在PHP 5.4.11,这实际上允许别名类的超类方法的bug。但是这被PHP开发人员认为是不可能的,所以我们仍然坚持上面提到的那个繁琐的解决方案。但是这个错误提出了一个关于可以用这个做什么的讨论,并且我希望它将在未来的版本中被定位。
同时,我一次又一次地遇到同样的问题。为了使用这种特性,我必须多次重复docblock的参数和行数,从而激怒我。所以,我想出了以坚持干燥的原则如下模式,就像我可以:
而不是重复整套的参数是这样的:
trait SayWorld {
/**
* This is a valid docblock.
*
* @param int $a Doc comment.
* @param int $b Doc comment.
*/
public function __construct($a, $b) {
echo (int)$c * ($a+$b);
}
}
class MyHelloWorld extends Base {
use SayWorld {
SayWorld::__construct as private __swConstruct;
}
/**
* Repeated and unnecessary docblock.
*
* @param int $a Doc comment.
* @param int $b Doc comment.
* @param int $c Doc comment.
*/
public function __construct($a, $b, $c = 0)
{
$this->__swConstruct($a, $b);
}
}
我写一个类很像元组(概念熟悉C#和Python用户),并用它来代替参数无尽的名单:
class SayWorldConstructTuple
{
public $a;
public $b;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
}
class MyHelloWorld extends Base {
use SayWorld {
SayWorld::__construct as private __swConstruct;
}
/**
* New and valid docblock.
*
* @param SayWorldConstructTuple $Tuple
* @param int $c Additional parameter.
*/
public function __construct(SayWorldConstructTuple $Tuple, $c = 0)
{
$this->__swConstruct($Tuple->a, $Tuple->b);
$this->c = $c;
}
}
注:这种模式当然有啦更有用元组的构造函数参数的大小,以及使用元组的更多类。
它可以通过使用PHP的动态特性进一步自动化。