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


Posted in PHP onOctober 12, 2017

前言

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

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

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

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

<?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 相关文章推荐
用PHP实现WEB动态网页静态
Oct 09 PHP
PHP3 safe_mode 失效漏洞
Oct 09 PHP
PHP生成唯一订单号
Jul 05 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
PHP实现的json类实例
Jul 28 PHP
PHP微信红包API接口
Dec 05 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
Apr 26 PHP
php实现在站点里面添加邮件发送的功能
Apr 28 PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
利用php的ob缓存机制实现页面静态化方法
Jul 09 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 #PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
Oct 12 #PHP
利用PHP实现开心消消乐的算法示例
Oct 12 #PHP
深入理解PHP中mt_rand()随机数的安全
Oct 12 #PHP
php表单习惯用的正则表达式
Oct 11 #PHP
彻底搞懂PHP 变量结构体
Oct 11 #PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 #PHP
You might like
php如何调用webservice应用介绍
2012/11/24 PHP
浅析php中jsonp的跨域实例
2013/06/21 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
jQuery侧边栏随窗口滚动实现方法
2013/03/04 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
Python常用内置模块之xml模块(详解)
2017/05/23 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
详解python中init方法和随机数方法
2019/03/13 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
python pygame实现方向键控制小球
2019/05/17 Python
详解python中__name__的意义以及作用
2019/08/07 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
Pytorch自己加载单通道图片用作数据集训练的实例
2020/01/18 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
美国最受欢迎的童装品牌之一:The Children’s Place
2016/07/23 全球购物
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
JavaScript实现页面动态验证码的实现示例
2021/03/23 Javascript
汽车维修专业个人求职信范文
2014/01/01 职场文书
2014年庆元旦活动方案
2014/02/15 职场文书
委托书格式范文
2015/01/28 职场文书
2016关于学习党章的心得体会
2016/01/15 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang