前言
本文主要介紹了關于如何直接訪問php實例對象中private屬性的相關內容,在介紹關鍵部分之前,我們先回顧一下php面向對象的訪問控制。
對屬性或方法的訪問控制,是通過在前面添加關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。被定義為公有的類成員可以在任何地方被訪問。被定義為受保護的類成員則可以被其自身以及其子類和父類訪問。被定義為私有的類成員則只能被其定義所在的類訪問。
類屬性必須定義為公有,受保護,私有之一。如果用 var 定義,則被視為公有。
請看下面示例代碼(來自官方文檔:http://php.net/manual/en/language.oop5.visibility.php
<?php /** * Define MyClass */ class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // Works echo $obj->protected; // Fatal Error echo $obj->private; // Fatal Error $obj->printHello(); // Shows Public, Protected and Private
如上面代碼所示,我們用一個類的實例對象訪問一個類的私有或者受保護的成員屬性時,會拋出一個致命錯誤。
下面是文章標題要做的事情,訪問php實例對象的私有屬性。
按照我們正常的做法,一般都會是寫一個public的方法,再返回這個屬性。
public function getPrivate() { return $this->private; }
事實是我們本就應該這樣做。
下面說是只是特殊場景下的使用方法,平時寫代碼希望大家不要亂來。
<?php class A { private $a = 'self'; public function test() { $other = new self(); $other->a = 'other'; var_dump($other->a); } } $aa = new A(); $aa->test();
如上代碼所示,我們new了一個新的A對象出來,再給這個實例的私有屬性a賦值,竟然沒有報錯!
解釋:因為同一個類的對象即使不是同一個實例也可以互相訪問對方的私有與受保護成員。這是由于在這些對象的內部具體實現的細節都是已知的。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對的支持。
【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。