如何直接访问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的栏目导航程序
Oct 09 PHP
php中的MVC模式运用技巧
May 03 PHP
PHP If Else(elsefi) 语句
Apr 07 PHP
php命名空间学习详解
Feb 27 PHP
PHP+javascript制作带提示的验证码源码分享
May 28 PHP
浅谈php扩展imagick
Jun 02 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
浅析iis7.5安装配置php环境
May 10 PHP
php实现对象克隆的方法
Jun 20 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
php采集神器cURL使用方法详解
Feb 19 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/07/12 PHP
php中使用GD库做验证码
2016/03/31 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
用 JavaScript 迁移目录
2006/12/18 Javascript
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
Javascript监视变量变化的方法
2015/06/09 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
vue.js中$set与数组更新方法
2018/03/08 Javascript
Vue中的nextTick作用和几个简单的使用场景
2021/01/25 Vue.js
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
使用python实现baidu hi自动登录的代码
2013/02/10 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
Python paramiko模块的使用示例
2018/04/11 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
大专生自荐信
2013/10/04 职场文书
车间调度岗位职责
2013/11/30 职场文书
计算机专业毕业生自我鉴定
2014/01/16 职场文书
三年大学自我鉴定
2014/01/16 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
党员演讲稿
2014/09/04 职场文书
导游词之山海关
2019/12/10 职场文书
Python Parser的用法
2021/05/12 Python
教你用python实现12306余票查询
2021/06/30 Python
MySQL系列之三 基础篇
2021/07/02 MySQL
SQL中的三种去重方法小结
2021/11/01 SQL Server