鍍金池/ 問答/PHP  網(wǎng)絡(luò)安全/ php繼承及私有屬性訪問問題

php繼承及私有屬性訪問問題

class FatherClass
{
    // private $salary = 1000;
    private $salary = 1000;

    public function showInfo()
    {
        echo $this->phone . '<br/>';
        echo $this->salary . '<br/>';
    }
}

class ChildClass extends FatherClass
{
    protected $phone = '13987654321';
    private $salary = 20000;
}

$child = new ChildClass();
$child->showInfo();
echo '<pre>';
print_r($child);

輸出:
13987654321
1000
ChildClass Object
(
    [phone:protected] => 13987654321
    [salary:ChildClass:private] => 20000
    [salary:FatherClass:private] => 1000
)

疑問:
child實(shí)例現(xiàn)在有兩個(gè)私有屬性,我可以理解為成員方法在哪個(gè)類中,私有屬性就調(diào)用哪個(gè)類的
那么如果注釋掉父類中的 private $salary = 1000; 結(jié)果就會(huì)報(bào)錯(cuò):
Cannot access private property ChildClass::$salary····
不能訪問 ChildClass 類的私有屬性,我也可以理解,因?yàn)楦割愊鄬?duì)子類是類外,不能訪問私有屬性
那么 protected 的屬性也在類外,怎么又能訪問了呢?

如果理解為 子類繼承了父類的成員方法,所以訪問到了子類的 protected 屬性,那為什么又不能訪問子類的私有屬性呢?

還是說(shuō):私有屬性是區(qū)分類的(從打印結(jié)果看出),訪問私有屬性時(shí),只訪問本類中的私有屬性,而訪問public和protected的屬性,則根據(jù)對(duì)象實(shí)例具體的值決定?

謝謝諸位,不知道我的描述清楚不

回答
編輯回答
逗婦乳
為什么又不能訪問子類的私有屬性呢

???如果能訪問,那私有屬性中的"私有"二字的意義是什么??

2017年5月29日 14:58
編輯回答
毀憶

protected能訪問, 是因?yàn)閜rotected規(guī)定繼承類可以訪問,外部不可以. 設(shè)定這個(gè)關(guān)鍵字就是為了干這個(gè)的

2017年6月9日 03:14
編輯回答
好難瘦

protected: 關(guān)鍵字是只有這個(gè)類和這個(gè)類的子類可以訪問
private:只有類本身可以訪問
public: 所有類都能訪問

沒有為什么,這是語(yǔ)言規(guī)定。

2017年2月12日 21:47
編輯回答
涼汐

感謝諸位的幫助,可能我糾結(jié)的點(diǎn)描述的不是很清楚,我糾結(jié)的是,父類成員方法在調(diào)用私有屬性的邏輯是怎樣的····
現(xiàn)在搞明白了:
子類覆蓋了父類的 public、protected 屬性,而沒有覆蓋父類的 private 屬性,因此子類的實(shí)例現(xiàn)在有兩個(gè)同名的私有屬性,而調(diào)用的成員方法又在父類中,所以使用父類的私有屬性
如果父類沒有,則使用子類的,但使用子類的,又沒有權(quán)限(父類的成員方法相對(duì)于子類來(lái)說(shuō)是類外),則提示錯(cuò)誤
Fatal error: Uncaught Error: Cannot access private property ChildClass::$salary in ···
如果子類也沒有,會(huì)提示
Notice: Undefined property: ChildClass::$salary in ····
這說(shuō)明PHP內(nèi)部確實(shí)先找了子類的,如果有、但發(fā)現(xiàn)沒有權(quán)限,所以提示上面的 Fatal error

2017年8月25日 09:05