教你如何直接訪問php實例對象的private屬性

在介紹關鍵部分以前,咱們先回顧一下php面向對象的訪問控制。php

對屬性或方法的訪問控制,是經過在前面添加關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。被定義爲公有的類成員能夠在任何地方被訪問。被定義爲受保護的類成員則能夠被其自身以及其子類和父類訪問。被定義爲私有的類成員則只能被其定義所在的類訪問。oop

類屬性必須定義爲公有,受保護,私有之一。若是用 var 定義,則被視爲公有。this

請看下面示例代碼(來自官方文檔 http://php.net/manual/en/lang....net

<?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

如上面代碼所示,咱們用一個類的實例對象訪問一個類的私有或者受保護的成員屬性時,會拋出一個致命錯誤code

下面是文章標題要作的事情,訪問php實例對象的私有屬性
按照咱們正常的作法,通常都會是寫一個public的方法,再返回這個屬性。對象

public function getPrivate()
{
    return $this->private;
}

事實是咱們本就應該這樣作。文檔

下面說是隻是特殊場景下的使用方法,平時寫代碼但願你們不要亂來。get

<?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賦值,居然沒有報錯!it

解釋:由於同一個類的對象即便不是同一個實例也能夠互相訪問對方的私有與受保護成員。這是因爲在這些對象的內部具體實現的細節都是已知的。io

相關文章
相關標籤/搜索