在介紹關鍵部分之前,我們先回顧一下php物件導向的存取控制。
對屬性或方法的存取控制,是透過在前面加上關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。被定義為公有的類別成員可以在任何地方被存取。被定義為受保護的類別成員則可以被其本身以及其子類別和父類別存取。被定義為私有的類別成員則只能被其定義所在的類別存取。
類別屬性必須定義為公有,受保護,私有之一。如果用 var 定義,則視為公有。
請看下面範例程式碼(來自官方文件http://php.net/manual/en/lang...:
<?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賦值,竟然沒有報錯!
解釋:因為同一個類別的物件即使不是同一個實例也可以互相存取對方的私有與受保護成員。這是由於在這些物件的內部具體實現的細節都是已知的。
以上是如何直接存取php實例物件的private屬性的詳細內容。更多資訊請關注PHP中文網其他相關文章!