Как вы переопределяете себя?

Я хочу построить класс, который реализует много методов, основанных на его идентификаторе,
поэтому я хочу иметь одного родителя класса, который реализует методы!
и когда я захочу использовать этот класс, я расширю его и просто переопределю переменную id:

 class parent
{
$id = "parent";
private __construct()
{
}

public static function create_instance()
{
$instance = new self();
return $instance;
}

public static function print_id()
{
echo $this->id;
}}

class child extend parent
{
$id = "child";

}

$instance = child::create_instance();
$instance->print_id();

результат будет «родительским», но я хочу, чтобы результат был дочерним?
Как это сделать ?

РЕДАКТИРОВАТЬ Я также попробовал это и получил родителя вместо ребенка:

class parent1 {
private $id = "parent";
public function __construct() {
}
public static function create_instance() {
$instance = new static ();
return $instance;
}
public function print_id() {
echo $this->id;
}
}
class child extends parent1 {
private $id = "child";
}

$instance = child::create_instance ();
$instance->print_id ();

2

Решение

Проблема в том, что видимость $id является частным, тогда как он должен быть защищен, потому что print_id() определяется только на родителя; как таковой он может достичь только своего $id,

class parent1 {
protected $id = "parent";
// ...
}

class child extends parent1 {
protected $id = "child";
}

Альтернатива, конечно, переопределить print_id() в детском классе.

2

Другие решения

В настоящее время при вызове метода create_instance для дочернего класса в качестве результата создается экземпляр родительского класса, а не дочерний класс, как вы ожидаете.

Используйте позднюю статическую привязку в методе родительского класса «create_instance»:

public static function create_instance()
{
$instance = new static();
return $instance;
}

Подробнее http://php.net/manual/en/language.oop5.late-static-bindings.php

2

По вопросам рекламы [email protected]