myślę na razie jedynym sposobem na to, co chcesz:
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:
Moja rada, oparta na ponad roku radzenia sobie z cechą s w PHP, to: unikaj pisania konstruktorów o cechach w ogóle, lub jeśli musisz - przynajmniej spraw, by były bez parametrów. Posiadanie ich w cechach jest sprzeczne z ideą konstruktorów w ogóle, która jest: konstruktorzy powinni być specyficzni dla klasy, do której należą. Inne, rozwinięte języki wysokiego poziomu nawet nie obsługują niejawnego dziedziczenia konstruktora. Dzieje się tak, ponieważ konstruktory mają o wiele silniejszy związek z klasą niż inne metody. W rzeczywistości mają tak silną relację, że nawet LSP nie ma do nich zastosowania. Cechy w języku Scala (bardzo dojrzały i SOLID -przyjazny następca Javy), can't have a constructor with parameters.
Edit 1:
Było bug w PHP 5.4.11, która faktycznie pozwoliło aliasu metody nadklasy. Ale to zostało uznane za nie-nie przez programistów PHP, więc nadal utknęliśmy w tym kłopotliwym rozwiązaniu, które przedstawiłem powyżej. Ale ten błąd wywołał dyskusję o tym, co można z tym zrobić, i mam nadzieję, że zostanie skierowany w przyszłych wydaniach.
Tymczasem natknąłem się na ten sam problem w kółko. Moja irytacja rosła wykładniczo wraz z liczbą parametrów i linii docblocka, które musiały być powtarzane wiele razy, aby móc korzystać z tej cechy. Więc wymyśliłem następujący wzór w celu trzymać się reguły DRY jak mogłem:
zamiast powtarzać cały zestaw parametrów tak:
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);
}
}
napisać klasę podobnie jak krotka (koncepcja znana C# i Python użytkowników) i używać go zamiast niekończącej się listy parametrów:
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;
}
}
Uwaga: ten wzór jest oczywiście bardziej przydatne z la większa ilość parametrów konstruktora krotki i więcej klas za pomocą krotki.
Można go dalej zautomatyzować za pomocą dynamicznej natury PHP.
Tylko ostrzeżenie.Aliasy atrybutów spowodują awarię PHP od wersji 5.4.7, szczególnie w przypadku autoloaderów. Poprawka została dodana do repozytorium, więc mam nadzieję, że pojawi się w następnej wersji. – Matthew