如何直接存取php範例物件的private屬性

2020-07-16 10:06:08
在介紹關鍵部分之前,我們先回顧一下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屬性的詳細內容,更多請關注TW511.COM其它相關文章!