php物件導向文法4:訪問修飾限定符,public,protected,private

來源:互聯網
上載者:User
訪問修飾限定符:
用於描述,一個成員(屬性,方法)在哪裡才能被訪問到!

tip:
PHP是採用類的概念,進行成員的限制訪問的!
PHP將訪問的代碼,分成三大地區:類內,類外,繼承鏈類內!

是根據:
目標成員在哪裡定義 與 目標成員在哪裡訪問(看當前訪問->屬性/方法的代碼在哪裡執行)的位置 來決定類內,類外還是繼承鏈類內!

<?php class A{    public function iam_a(){            var_dump($this->property);    } }class B extends A{    //在B類中定義    public $property='phpphphp';    public function iam_b(){        var_dump($this->property);    }}class C extends B{    public function iam_c(){            var_dump($this->property);    }}/*public $property='phpphphp';公用的,指的是,成員在本類內,繼承鏈上的類內,與類外,都可以被訪問!*///明確目標成員$property是在B類中定義的。$c=new C;// $c->property;在B類外執行,可以訪問到echo $c->property;echo '<hr/>';// iam_c()中的$this->property是在B類的繼承鏈內,可以訪問到$c->iam_c();// iam_b()中的$this->property是在B類內,可以訪問到$c->iam_b();//iam_a()中的$this->property是在B類的繼承鏈內,可以訪問到$c->iam_a();
運行結果:string(8) "phpphphp"string(8) "phpphphp"string(8) "phpphphp"string(8) "phpphphp"

protected $property=’phpphphp’;
保護的,指的是,成員在本類內,繼承鏈(子類,父類)上的類內 可以被訪問

$c=new C;// $c->property;在B類外執行,不能訪問到var_dump($c->property);// iam_c()中的$this->property是在B類的繼承鏈內,可以訪問到$c->iam_c();// iam_b()中的$this->property是在B類內,可以訪問到$c->iam_b();//iam_a()中的$this->property是在B類的繼承鏈內,可以訪問到$c->iam_a();
運行結果:PHP Fatal error: Cannot access protected property C::$property in /usercode/file.php on line 25

private $property=’phpphphp’
私人的,指的是,只有本類內,可以訪問!

$c=new C;// $c->property;在B類外執行,不能訪問到var_dump($c->property);// iam_c()中的$this->property是在B類的繼承鏈內,不能訪問到$c->iam_c();// iam_b()中的$this->property是在B類內,可以訪問到$c->iam_b();//iam_a()中的$this->property是在B類的繼承鏈內,不能訪問到$c->iam_a();
運行結果:NULLNULLstring(8) "phpphphp"NULLPHP Notice: Undefined property: C::$property in /usercode/file.php on line 25 PHP Notice: Undefined property: C::$property in /usercode/file.php on line 19 PHP Notice: Undefined property: C::$property in /usercode/file.php on line 4

如何選擇:
一個原則,盡量體現封裝性。封裝性,指的是,盡量隱藏內部實現,而僅僅開發外部操作介面!文法上,就是,將不需要外部使用的屬性,方法,都私人化(保護化),而僅僅留下一些必要的公用方法!
一個類至少有一個公用方法,可以在類外調用。
如果一個類沒有打算被繼承,成員可以多用private。如果一個類是作為一個基礎類,設計時就有打算被子類繼承的,某些成員就會用到protected。還是看具體的業務要求。

tip:
1、一般情況下,如果出現重寫,那麼以重寫後的定義位置為準。
(例外是私人屬性在本類內訪問時不能被重寫。)

<?php class A{    public function iam_a(){            var_dump($this->property);    } }class B extends A{    //在B類中定義public $property    public $property='phpphphp';    public function iam_b(){            var_dump($this->property);    }}class C extends B{//C類定義了同名屬性    public $property='chongxiechongxiechongxie';    public function iam_c(){            var_dump($this->property);    }}$c=new C;echo $c->property;echo '<hr/>';//確定了下面三個方法中$this都是C類對象,先尋找C類中有沒有定義property屬性,如果沒有,再往父類找。$c->iam_c();$c->iam_b();$c->iam_a();
運行結果:chongxiechongxiechongxiestring(24) "chongxiechongxiechongxie"string(24) "chongxiechongxiechongxie"string(24) "chongxiechongxiechongxie"

注意:重寫父類的屬性或者方法時,存取控制修飾符一定要比父類的同名屬性或者方法弱。private 最強,public最弱。

例外:
私人屬性在本類內訪問時不能被重寫。

<?php class A{    public function iam_a(){            echo '在繼承鏈內訪問<br/>';            var_dump($this);            var_dump($this->property);            echo '<hr/>';    } }class B extends A{    //在B類中定義private $property    private $property='phpphphp';    public function iam_b(){        echo '類內訪問<br/>';            var_dump($this);            var_dump($this->property);            echo '<hr/>';    }}class C extends B{//在C類中定義同名屬性    public $property='chongxiechongxiechongxie';    public function iam_c(){            echo '在繼承鏈內訪問<br/>';            var_dump($this);            var_dump($this->property);            echo '<hr/>';    }}$c=new C;echo '在類外訪問'.$c->property;//在類外訪問echo '<hr/>';$c->iam_c();//在繼承鏈內訪問$c->iam_b();//在B類內訪問$c->iam_a();//在繼承鏈內訪問
運行結果:在類外訪問chongxiechongxiechongxie在繼承鏈內訪問string(24) "chongxiechongxiechongxie"object(C)#1 (2) {["property"]=>string(24) "chongxiechongxiechongxie"["property":"B":private]=>string(8) "phpphphp"}string(24) "chongxiechongxiechongxie"類內訪問,不能被重寫,string(8) "phpphphp"如果有知道原因的同學,請留個言解答下,謝謝object(C)#1 (2) {["property"]=>string(24) "chongxiechongxiechongxie"["property":"B":private]=>string(8) "phpphphp"}string(8) "phpphphp"在繼承鏈內訪問string(24) "chongxiechongxiechongxie"object(C)#1 (2) {["property"]=>string(24) "chongxiechongxiechongxie"["property":"B":private]=>string(8) "phpphphp"}string(24) "chongxiechongxiechongxie"

以上就是php物件導向文法4:訪問修飾限定符,public,protected,private的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.