Я хочу построить класс, который реализует много методов, основанных на его идентификаторе,
поэтому я хочу иметь одного родителя класса, который реализует методы!
и когда я захочу использовать этот класс, я расширю его и просто переопределю переменную 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 ();
Проблема в том, что видимость $id
является частным, тогда как он должен быть защищен, потому что print_id()
определяется только на родителя; как таковой он может достичь только своего $id
,
class parent1 {
protected $id = "parent";
// ...
}
class child extends parent1 {
protected $id = "child";
}
Альтернатива, конечно, переопределить print_id()
в детском классе.
В настоящее время при вызове метода 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