>백엔드 개발 >PHP 튜토리얼 >这段代码为何会输出father?

这段代码为何会输出father?

WBOY
WBOY원래의
2016-06-06 20:33:011160검색

<code><?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();
</code>

回复内容:

<code><?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();
</code>

因为son里的init方法是public,而father的init方法是private,这个其实表示你son里的init方法并没有重写父类里的方法。那自然调用的仍然是父类自己的实现了

<code>$son.init(); // son
</code>

<code>php</code><code><br>class father
{
    public function __construct()
    {
        // $this->init();
      static::init();//php5.6
    }

    private function init()
    {
        echo "father\n";
    }
}

class son extends father
{
    /*public function __construct()
    {
        $this->init();
    }*/
    public function init()
    {
        echo "son\n";
    }
}
</code>

后期静态绑定

Reference: http://docs.php.net/manual/en/language.oop5.late-static-bindings.php

Note:
In non-static contexts, the called class will be the class of the object instance. Since $this-> will try to call private methods from the same scope, using static:: may give different results. Another difference is that static:: can only refer to static properties.

<code>class father
{
    public function __construct()
    {
        $this->init();
    }

    private function init()
    {
        echo "father\n";
    }
}

class son extends father
{
    public function __construct()
    {
        parent::__construct();
        $this->init();
    }

    private function init()
    {
        echo "son\n";
    }
}

new son();
</code>

输出

<code>father
son
</code>

建议查看__construct基础知识,想告诉楼主踏实一点,我就不信你弄清了里面的方法还会来问
授之以渔

private方法无法被重写

father中的init如果是public或protected,那么是会输出son;但是现在是private,所以在father中调用init是不会输出son的,而是调father的int输出father。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.