教你如何直接访问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

相关文章
相关标签/搜索