我认为现在唯一能做你想做的就是:
class MyHelloWorld extends Base {
use SayWorld {
SayWorld::__construct as private __swConstruct;
}
public function __construct($a, $b, $c = 0)
{
$this->__swConstruct($a, $b, $c);
}
}
Edit 2:个
基于一年多在PHP中处理特性的经验,我的建议是:avoid writing constructors in traits at all,或者如果必须的话——至少让它们无参数化.让他们具有trait 与建设者通常的 idea 背道而驰,即:constructors should be specific to a class to which they belong.其他一些经过进化的高级语言甚至不支持隐式构造函数继承.这是因为构造函数与类的关系比其他方法强得多.事实上,他们之间的关系如此密切,甚至LSP人也不适用于他们.Scala语言(Java的一个非常成熟和SOLID友好的继承者)的特性,can't have a constructor with parameters.
Edit 1:
PHP5.4.11中有一个bug,它实际上允许对超类方法进行别名.但是PHP开发人员认为这是不允许的,所以我们仍然坚持使用我在上面介绍的那个笨重的解决方案.但这个bug引发了一场关于如何使用它的讨论,我希望它能在future 的版本中成为目标.
与此同时,我一次又一次地遇到同样的问题.我的恼怒随着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);
}
}
我编写了一个类似于tuple(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的动态特性,它可以进一步自动化.