如何直接访问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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
火车头discuz6.1 完美采集的php接口文件
Sep 13 PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 PHP
浅析SVN常见问题及解决方法
Jun 21 PHP
如何使用php输出时间格式
Aug 31 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
PHP7正式版测试,性能惊艳!
Dec 08 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
yii2中关于加密解密的那些事儿
Jun 12 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
May 14 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 中的一些经验积累
2006/10/09 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
发现的以前不知道的函数
2006/09/19 Javascript
使用javascript访问XML数据的实例
2006/12/27 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
javascript运动详解
2015/07/06 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
vue中使用腾讯云Im的示例
2020/10/23 Javascript
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
Python 数据结构之旋转链表
2017/02/25 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
详解Python修复遥感影像条带的两种方式
2020/02/23 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
面向对象概念面试题(.NET)
2016/11/04 面试题
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
工作个人的自我评价
2014/01/14 职场文书
安全环保标语
2014/06/09 职场文书
化学工程专业求职信
2014/08/10 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python