在介绍关键部分之前,我们先回顾一下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; // Worksecho $obj->protected; // Fatal Errorecho $obj->private; // Fatal Error$obj->printHello(); // Shows Public, Protected and Private

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

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

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

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

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

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

<?phpclass 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赋值,竟然没有报错!

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

更多相关文章

  1. 关于php类的定义与实例化方法
  2. php通过反射修改Exception实例的message属性
  3. 四种好用的PHP自定义加密函数(可逆/不可逆)
  4. 我扒了半天源码,终于找到了Oauth2自定义处理结果的最佳方案!
  5. 为你Springboot项目自定义一个通用的异常(实用干货)
  6. 一步为你的Springboot应用自定义banner
  7. VSCode跳转到定义内部实现_VSCode插件开发笔记4
  8. MyBatis 如何编写一个自定义插件?运行原理是什么?

随机推荐

  1. 从XML中读取数据到内存的实例
  2. 一个简单的基于XML的模块集成框架
  3. 从无到有实现一个xml数据库登录验证
  4. Xml_javascript分页
  5. 使用xml作为数据源,配合asp:Menu类自由扩
  6. 创建带有关联的 XML 架构的 XML 文件 &&
  7. 利用XSLT把ADO记录集转换成XML
  8. XPath 11个实例
  9. XML 问题: 超越DOM(轻松使用 DOM 的技巧
  10. 从xml中获取城市,省份名称