php - 这段代码为何会输出father?
天蓬老师
天蓬老师 2017-04-10 15:41:56
[PHP讨论组]
<?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();
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(7)
伊谢尔伦

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

阿神
$son.init(); // son
高洛峰
php
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"; } }

后期静态绑定

ringa_lee

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.

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();

输出

father
son
迷茫

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

黄舟

private方法无法被重写

PHPz

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号