Мне понравилась идея, представленная в this answer, позволяющая иметь что-то вроде нескольких конструкторов в PHP. Код у меня похож:self :: обращение к производному классу в статических методах родительского класса
class A {
protected function __construct(){
// made protected to disallow calling with $aa = new A()
// in fact, does nothing
};
static public function create(){
$instance = new self();
//... some important code
return $instance;
}
static public function createFromYetAnotherClass(YetAnotherClass $xx){
// ...
}
class B extends A {};
$aa = A::create();
$bb = B::create();
Теперь я хочу, чтобы создать производный класс B
, который будет использовать один и тот же «псевдо-конструктор», потому что это тот же самый код. Однако в этом случае, когда я не кодирую метод create()
, константа self
является классом A
, поэтому обе переменные $aa
и $bb
относятся к классу A
, тогда как я хочу $bb
быть классом B
.
Если я использую $this
специальных переменные, это, конечно, будет класс B
, даже в A
объеме, если я называю любой родительский метод из B
.
Я знаю, что могу скопировать весь метод create()
(возможно, черты помогают?), Но мне также нужно скопировать все «конструкторы» (все методы create*
), и это глупо.
Как я могу помочь $bb
стать B
, даже если метод вызывается в контексте A
?
Вы ищете [Поздние статические привязки] (http://stackoverflow.com/q/1912902/1233508). – DCoder
Возможно, вам нужен 'статический', а не' self'? – bishop
статический или родительский, – ArtisticPhoenix