我想构建基于它的id实现很多方法的类, 所以我希望有一个实现这些方法的类父类! 当我想要使用这个类时,我将扩展它并只覆盖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();
结果将是" parent",但我希望结果是孩子? 怎么做?
编辑:我也试过这个并得到了父母代替孩子:
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 ();
答案 0 :(得分: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
答案 1 :(得分:2)
问题是$id
的可见性是私有的,而应该受到保护,因为print_id()
仅在父级上定义;因此,它只能达到自己的$id
。
class parent1 {
protected $id = "parent";
// ...
}
class child extends parent1 {
protected $id = "child";
}
当然,替代方法是覆盖子类中的print_id()
。