如何直接访问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脚本的10个技巧(1)
Oct 09 PHP
ThinkPHP之getField详解
Jun 20 PHP
PHP的拦截器实例分析
Nov 03 PHP
在Windows系统下使用PHP生成Word文档的教程
Jul 03 PHP
ThinkPHP中create()方法自动验证表单信息
Apr 28 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP chop()函数讲解
Feb 11 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 PHP
php字符串过滤strip_tags()函数用法实例分析
Jun 24 PHP
Laravel框架实现的上传图片到七牛功能详解
Sep 06 PHP
tp5.1 框架路由操作-URL生成实例分析
May 26 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
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
一个PHP分页类的代码
2011/05/18 PHP
php类常量用法实例分析
2015/07/09 PHP
PHP检测链接是否存在的代码实例分享
2016/05/06 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
python+openCV利用摄像头实现人员活动检测
2019/06/22 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
python之生产者消费者模型实现详解
2019/07/27 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
德国网上超市:myTime.de
2019/08/26 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
兼职学生的自我评价
2013/11/24 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
Python OpenCV快速入门教程
2021/04/17 Python
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
一文简单了解MySQL前缀索引
2022/04/03 MySQL
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python