教你如何直接訪問php例項物件的private屬性

hncg發表於2019-02-16

在介紹關鍵部分之前,我們先回顧一下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賦值,竟然沒有報錯!

解釋:因為同一個類的物件即使不是同一個例項也可以互相訪問對方的私有與受保護成員。這是由於在這些物件的內部具體實現的細節都是已知的。

相關文章