这段代码为何会输出father?求合理解释?
<?php
class father
{
    public function __construct()
    {
        $this->init();
    }    private function init()
    {
        echo "father\n";
    }
}class son extends father
{
    public function init()
    {
        echo "son\n";
    }
}$son  = new son();

解决方案 »

  1.   

    1. new son 这个类的时候,会先调用 基类 father 的构造函数2.基类构造函数 又调用 init(); 所以输出father3.private 只能限制son 不能直接访问father类 init,但是不能限制 基类调用 自身的private 方法
      

  2.   

    突然看到你的标题了...PHP子类能否继承父类的构造方法?1.如果没有定义子类构造方法的,默认调用父类构造方法2.如果定义了子类的构造方法,那么就直接调用自身
      

  3.   

    那如果我把父类的init方法改成public 为何又会输出son?
      

  4.   

    public(共有) 不能覆盖 private(私有)
    需要解释吗?这和所有的权限系统都是一样的
      

  5.   

    在父类的构造方法中var_dump($this)出来的是 object(son).....那这为啥
      

  6.   


    因为你是new son
      

  7.   


    因为你是new son我知道,我的意思是,既然这个this是指向son的,那么this->init()不应该是调用son的init吗?那么不就是输出son么,为何输出father?
      

  8.   

    father::init() 是私有的
    son::init() 是共有的
    根据共有的不能覆盖私有的这个原则
    father::init() 不会被 son::init() 覆盖
    所以在执行 father::__construct() 时,$this->init() 执行的是 father::init()至于为什是 共有的不能覆盖私有的 而不是别的
    那就不太好说了,这是约定俗成的东西,没有什么道理可讲(当然也与西方人的价值观有关) 
      

  9.   

    可以这么理解:生成新的对象时第一部先初始化所以调用了父类的构造函数,构造函数又调用了$rhis->init(),$this是绑定调用本函数的那个对象的,而此时对象中还没有生成自身的init(),所以就用了父类的init()