如何直接访问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 相关文章推荐
Godaddy空间Zend Optimizer升级方法
May 10 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
Apr 07 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
ThinkPHP内置jsonRPC的缺陷分析
Dec 18 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
详解PHP的Yii框架中扩展的安装与使用
Apr 01 PHP
php投票系统之增加与删除投票(管理员篇)
Jul 01 PHP
thinkphp自带验证码全面解析
Sep 18 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
Oct 29 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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生成缩略图的代码
2011/01/12 PHP
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
php伪静态之APACHE篇
2014/06/02 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
JS 创建对象(常见的几种方法)
2008/11/03 Javascript
鼠标经过的文本框textbox变色
2009/05/21 Javascript
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
提高jQuery性能的十个诀窍
2013/11/14 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
[Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能实例代码
2016/12/20 Javascript
Vue数据驱动模拟实现5
2017/01/13 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[03:21]【TI9纪实】Old Boys
2019/08/23 DOTA
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
Python实现的密码强度检测器示例
2017/08/23 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
《我要的是葫芦》教学反思
2014/02/23 职场文书
计算机系本科生求职信
2014/05/31 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS