问答一下,轻松解决,电脑应用解决专家!
主板显卡CPU内存显示器
硬盘维修显卡维修显示器维修
注册表系统命令DOS命令Win8
存储光存储鼠标键盘
内存维修打印机维修
WinXPWin7Win10/Win11
硬件综合机箱电源散热器手机数码
主板维修CPU维修键盘鼠标维修
Word教程Excel教程PowerPointWPS
网络工具系统工具图像工具
数据库javascriptLinux系统
PHP教程CSS教程XML教程

深刻理解php“继承“、“私有属性“、“$this指向“的关系

更新时间:2021-09-29 11:45 作者:像树一样活着点击:

在官方文档中指出,子类能继承父类的 "公有属性/方法"、"受保护的属性/方法"
疑问1:父类的私有属性会被继承吗?
疑问2:父类的私有属性可以被覆盖吗?
疑问3:$this指向"private"属性 与 $this 指向"public/protected"属性的区别?

带着上面三个问题,我们做以下的测试:

<?php

class father {

    public $a = 'f_1';

    protected $b = 'f_2';

    private $c = 'f_3';

    public function write_a(){
        echo $this->a;
        echo '<br/>';
    }

    public function write_b(){
        echo $this->b;
        echo '<br/>';
    }

    public function write_c(){
        echo $this->c;
        echo '<br/>';
    }
}



class son extends father {

    public $a = 's_1';

    protected $b = 's_2';

    private $c = 's_3';

    public function write_a(){
        parent::write_a();
        echo $this->a;
    }

    public function write_b(){
        parent::write_b();
        echo $this->b;
    }

    public function write_c(){
        parent::write_c();
        echo $this->c;
    }
}

$a = new son();

$a->write_a();       //输出值  s_1  s_1
echo '<br/>';

$a->write_b();       //输出值  s_2  s_2
echo '<br/>';

$a->write_c();       //输出值  f_1  s_1

通过上面的例子我们可以看出,父类的私有属性肯定是不会被覆盖的,否则不同方法中,访问的"$this->c"不会出现不同的值;

接上面的代码:

print_r($a)   

// 打印出来的值
// son Object ( [a] => s_1 [b:protected] => s_2 [c:son:private] => s_3 [c:father:private] => f_3 ) 

我们观察到实例化类“son”后的对象"$a",发现“son”这个类也是继承了"father"当中的"c"属性,只不过在归属当中,区分了"son"中的"c"属性与"father"中的“c”属性。"son"无法使用"father"中的"c"属性。

那为什么执行

$a->write_c();       //输出值  f_1  s_1


截取上面的部分代码:

#class father 当中的代码:    
public function write_c(){
    echo $this->c;
    echo '<br/>';
}


#class son 当中的代码:
public function write_c(){
    parent::write_c();
    echo $this->c;
}        

输出的值不同呢?

验证1:在实例化"son"后的对象$a,"father"当中的"$this"与"son"当中的"$this"是否相同?

我们分别在对应方法中,输出$this的值进行观察:

截取上面的部分代码:

#class father 当中的代码:    
public function write_c(){
    print_r($this); 
//  son Object ( [a] => s_1 [b:protected] => s_2 [c:son:private] => s_3 [c:father:private] => f_3 ) 
    echo $this->c;
    echo '<br/>';
}


#class son 当中的代码:
public function write_c(){
    print_r($this); 
//  son Object ( [a] => s_1 [b:protected] => s_2 [c:son:private] => s_3 [c:father:private] => f_3 )
    parent::write_c();
    echo $this->c;
}    

$this的值是相同的(都是实例化"son"类后的对象);

这时候我们可以明确,在$this指向上,对于"private"属性与"public/protected"属性肯定是不同的。

所以说我们可以这样理解这个问题:

当实例化一个类产生对象时,如果类当中存在"私有属性"(私有方法),并且在类的任意方法中,存在$this指向"私有属性"(私有方法);此时$this指针始终指向的是$this所在类当中的"私有属性"(私有方法),不会被子类中的同名属性或者方法给覆盖。同样,子类中的"私有属性"(私有方法),父类也不可能可以通过$this直接调用。

简而言之,私有属性(私有方法)仅仅属于对其定义的类,无论该类处于继承链的哪一个辈分当中。在类当中$this指向的“私有属性”(私有方法)始终都是自己类当中定义的“私有属性”(私有方法)。

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
你可能感兴趣的内容