如何直接访问php实例对象中的private属性详解

本文主要介绍了关于如何直接访问php实例对象中private属性的相关内容,在介绍关键部分之前,我们先回顾一下php面向对象的访问控制。

对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。

类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。

请看下面示例代码(来自官方文档:http://php.net/manual/en/language.oop5.visibility.php

  1. <?php
  2. /**
  3. * Define MyClass
  4. */
  5. class MyClass
  6. {
  7. public $public = 'Public';
  8. protected $protected = 'Protected';
  9. private $private = 'Private';
  10. function printHello()
  11. {
  12. echo $this->public;
  13. echo $this->protected;
  14. echo $this->private;
  15. }
  16. }
  17. //phpfensi.com
  18. $obj = new MyClass();
  19. echo $obj->public; // Works
  20. echo $obj->protected; // Fatal Error
  21. echo $obj->private; // Fatal Error
  22. $obj->printHello(); // Shows Public, Protected and Private

如上面代码所示,我们用一个类的实例对象访问一个类的私有或者受保护的成员属性时,会抛出一个致命错误。

下面是文章标题要做的事情,访问php实例对象的私有属性。

按照我们正常的做法,一般都会是写一个public的方法,再返回这个属性。

  1. public function getPrivate()
  2. {
  3. return $this->private;
  4. }

事实是我们本就应该这样做。

下面说是只是特殊场景下的使用方法,平时写代码希望大家不要乱来。

  1. <?php
  2. class A {
  3. private $a = 'self';
  4. public function test() {
  5. $other = new self();
  6. $other->a = 'other';
  7. var_dump($other->a);
  8. }
  9. }
  10. $aa = new A();
  11. $aa->test();

如上代码所示,我们new了一个新的A对象出来,再给这个实例的私有属性a赋值,竟然没有报错!

解释:因为同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。