前言
本文主要介紹了關于如何直接通路php執行個體對象中private屬性的相關内容,在介紹關鍵部分之前,我們先回顧一下php面向對象的通路控制。
對屬性或方法的通路控制,是通過在前面添加關鍵字 public(公有),protected(受保護)或 private(私有)來實作的。被定義為公有的類成員可以在任何地方被通路。被定義為受保護的類成員則可以被其自身以及其子類和父類通路。被定義為私有的類成員則隻能被其定義所在的類通路。
類屬性必須定義為公有,受保護,私有之一。如果用 var 定義,則被視為公有。
請看下面示例代碼(來自官方文檔:http://php.net/manual/en/language.oop5.visibility.php
<?php
/**
-
Define MyClass
*/
class MyClass
{
public $public = 'Public';
prot/【php教程_linux常用指令_網絡運維技術】/ected $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指派,竟然沒有報錯!
解釋:因為同一個類的對象即使不是同一個執行個體也可以互相通路對方的私有與受保護成員。這是由于在這些對象的内部具體實作的細節都是已知的。