你如何覆盖自我?

时间:2015-03-02 18:28:19

标签: php oop visibility

我想构建基于它的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 ();

2 个答案:

答案 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()