如何直接访问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 include加载文件两种方式效率比较
Aug 08 PHP
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
PHP中用hash实现的数组
Jul 17 PHP
PHP魔术方法__GET、__SET使用实例
Nov 25 PHP
深入浅析php中sprintf与printf函数的用法及区别
Jan 08 PHP
Zend Framework教程之Resource Autoloading用法实例
Mar 08 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
Aug 19 PHP
PHP判断是否是微信打开还是浏览器打开的方法
Feb 27 PHP
php中字符串和整数比较的操作方法
Jun 06 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
Jun 03 PHP
PHP 实现链式操作
Mar 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对文件夹递归执行chmod命令的方法
2015/06/19 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
JQuery写动态树示例代码
2013/07/31 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
react.js使用webpack搭配环境的入门教程
2017/08/14 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
Node.js readline模块与util模块的使用
2018/03/01 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
在layui.use 中自定义 function 的正确方法
2019/09/16 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
python虚拟环境virtualenv的使用教程
2017/10/20 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
python实现KNN分类算法
2019/10/16 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
VC++笔试题
2014/10/13 面试题
数控技术应届生求职信
2013/11/13 职场文书
求职信需要的五点内容
2014/02/01 职场文书
学校教师读书活动总结
2014/07/08 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
如何写好活动总结
2019/06/21 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python