Home > Backend Development > PHP Tutorial > 这段代码为何会输出father?

这段代码为何会输出father?

WBOY
Release: 2016-06-06 20:33:01
Original
1183 people have browsed it

<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>
Copy after login
Copy after login

回复内容:

<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>
Copy after login
Copy after login

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

<code>$son.init(); // son
</code>
Copy after login

<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>
Copy after login

后期静态绑定

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>
Copy after login

输出

<code>father
son
</code>
Copy after login

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

private方法无法被重写

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

Related labels:
php
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template