如何直接访问php实例对象中的private属性详解

前言

本文主要介绍了关于如何直接访问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赋值,竟然没有报错!

解释:因为同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • php类中private属性继承问题分析

    请仔细看这句话 如果父类有私有的属性.那么父类的方法只为父类的私有属性服务. 下面通过一系列列子来加深理解. 这个例子看起来很奇怪,在子类中重新定义了一个属性$sal,系统却返回了父类的属性. 复制代码 代码如下: <? class employee{ private $sal=3000; //protected $sal=3000; public function getSal(){ return $this->sal; } } class Manager extends employee

  • 浅析php面向对象public private protected 访问修饰符

    PHP中有三种访问修饰符,分别是:     public(公共的.默认)     protected(受保护的)     private(私有的)public(公共的.默认)在PHP5中如果类没有指定成员的访问修饰符,默认就是public的访问权限.protected(受保护的)被声明为protected的成员,只允许该类的子类进行访问.private(私有的 ) 被定义为private的成员,对于类内部所有成员都可见,没有访问限制.对类外部不允许访问. 图解demo 复制代码 代码如下: cl

  • PHP类与对象中的private访问控制的疑问

    复制代码 代码如下: class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo ext

  • 反射调用private方法实践(php、java)

    单测中有个普遍性的问题,被侧类中的private方法无法直接调用.小拽在处理过程中通过反射改变方法权限,进行单测,分享一下,直接上代码. 简单被测试类 生成一个简单的被测试类,只有个private方法. 复制代码 代码如下: <?php/** * 崔小涣单测的基本模板. * * @author cuihuan * @date 2015/11/12 22:15:31 * @version $Revision:1.0$ **/class MyClass {/** * 私有方法 * * @param

  • php class中public,private,protected的区别以及实例分析

    一,public,private,protected的区别public:权限是最大的,可以内部调用,实例调用等.protected: 受保护类型,用于本类和继承类调用.private: 私有类型,只有在本类中使用. 二,实例 复制代码 代码如下: <?phperror_reporting(E_ALL);class test{ public $public; private $private; protected $protected; static $instance; public  func

  • 浅谈php中的访问修饰符private、protected、public的作用范围

    1. private 只能在类内部使用 2. protected 可以在类内部和继承类里使用.类外部不能使用[即实例化后的对象无法调用] 3. public 全部范围适用. 4.子类复写父类中的方法时,子类中的 访问修饰符的范围要大于等于 父类的[ 继承只能发扬光大,至少保持不变.不可以丢失东西.] 以上这篇浅谈php中的访问修饰符private.protected.public的作用范围就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 如何直接访问php实例对象中的private属性详解

    前言 本文主要介绍了关于如何直接访问php实例对象中private属性的相关内容,在介绍关键部分之前,我们先回顾一下php面向对象的访问控制. 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的.被定义为公有的类成员可以在任何地方被访问.被定义为受保护的类成员则可以被其自身以及其子类和父类访问.被定义为私有的类成员则只能被其定义所在的类访问. 类属性必须定义为公有,受保护,私有之一.如果用 var 定义,则被视为公

  • Javascript中window.name属性详解

    关于window下自带name的属性 不知道大家有没有发现这样一种情况 在控制台里直接输出未声明变量,正常情况应该是会报错的,而且声明未赋值的变量输出应该是undefined var a; //undefined b; //报错 但是偏偏就个别特例,就是name属性 其实window自身就带有name这个属性,在控制台输入window可以可以看到 打开 往下翻就可以找到 window.name直译过来是窗口名字,主要用于为超链接和表单设置目标(targets),什么意思呢,我们做个案例 建立两个

  • vue2中组件互相调用实例methods中的方法实现详解

    目录 前言: 开始前: 使用 第一步.定义全局mixin 第二步添加代码提示d.ts声明文件 在项目下新建jsconfig.json 添加shims-vue.d.ts声明文件 添加event-keys.d.ts声明文件 第三步编写webpack插件 新建global-dispatch.js 自动生成event-keys.d.ts 添加vue-path-loader.js webpack loader文件 配置vue.config.js 后记 仓库地址 总结 前言: 大家都知道在vue2中相互调用

  • Spring Cloud 中@FeignClient注解中的contextId属性详解

    目录 @FeignClient注解中的contextId属性 解决方法一 解决方法二 FeignClient注解及参数问题 问题背景 解决办法 @FeignClient注解中的contextId属性 在使用@FeignClient注解前,我们需要先引入其相关依赖,版本为3.0.1 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter

  • Vue中的computed属性详解

    目录 插值表达式 methods computed 总结 今天来说说vue中的计算属性computed,为了更好的理解计算属性的好处,我们先通过一个案例来慢慢 了解计算属性,有如下案例:定义两个输入框以及一个span标签,span标签中的内容为两个输入框中的值,span标签中的内容随着输入框中的内容变化而变化 插值表达式 我们先用插值表达式的方法来实现这一效果 <body> <div id="app"> 姓: <input type="text&

  • react-router中<Link/>的属性详解

    本文主要给大家介绍了关于react-router中 的属性的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 使用Link标签 // 字符串定位描述符 String location descriptor. <Link to="/hello"> Hello </Link> // 对象定位描述符 Object location descriptor. <Link to={{ pathname: '/hello', query: { name: '

  • Android中的windowSoftInputMode属性详解

    在前面的一篇文章中,简单的介绍了一下如何实现软键盘不自动弹出,使用的方法是设置android:windowSoftInputMode属性.那么,这个属性到底是干什么的,他有什么作用呢?今天这篇文章,就是探索android:windowSoftInputMode属性的作用的. 首先,我们从这个属性的名称中,可以很直观的看出它的作用,这个属性就是来设置窗口软键盘的交互模式的. android:windowSoftInputMode属性一共有9个取值,分别是: stateUnspecified,sta

  • ASP.NET 4.0配置文件中的ClientIDMode属性详解

    时光流逝,我们心爱的ASP.NET也步入了4.0的时代,微软在ASP.NET 4.0中对很多特性做了修改.比如我将要讨论的控件ID机制就是其中之一. 在ASP.NET 4.0之前我们总是要为控件的ClientID头疼,比如明明一个叫lblName的Label放在一个叫做grd的GridView里面后,在页面上改Label的ID就变成了诸如grd_clt02_lblName的一长串字符串,如果我们在前台想在使用JS的时候找到该Label,我们不得不用到C#脚本来获得该Label在前台的确切ID,诸

  • 在JavaScript实例对象中改写原型方法详情

    目录 在JavaScript中,我们通常可以像下面的代码这样来简单地定义一个类: var sample = function() { // constructor code here } sample.prototype.func1 = function() { // func1 code here } sample.prototype.func2 = function() { // func2 code here } /* more sample prototype functions her

  • List集合对象中按照不同属性大小排序的实例

    实例如下: package com.huad.luck; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Test { public static void main(String[] args) { Person p = new Person(); p.setName("tom"); p.

随机推荐