php中如何在外部修改类的私有或受保护属性值
php中怎么在外部修改类的私有或受保护属性值
在做单元测试框架时,发现了个比较郁闷的问题:测试人员需要在类外修改类的private或protected成员变量的值,而这些变量没有抽象成public的属性,同时为了代码量的问题,也不可能修改要测试的类。怎么在类外修改类的私有变量呢?请看下面的关键代码:
类文件sellAction.php, 内容如下:
<?php class SellAction{ protected $cUid; private $id; public $pId; public function output(){ echo "output protected cUid :".$this->cUid; echo "<br>"; echo "output private id :".$this->id; echo "<br>"; echo "output public pId:".$this->pId; echo "<br>"; } }
测试文件test.php,内容如下:
<?php require "sellAction.php"; function initReferenceAttr(& $reference, $arr) { if(!is_object($reference)) { throw new Exception('reference must be object'); } if(!is_array($arr)) { throw new Exception('arr must be array'); } $cls = get_class($reference); $reflectCls = new ReflectionClass ($cls); foreach($arr as $key => $val) { $pro = $reflectCls->getProperty($key); if($pro && ($pro->isPrivate() || $pro->isProtected())){ $pro->setAccessible(true); $pro->setValue($reference, $val); }else{ $reference->$key = $val; } } return true; } $act = new SellAction(); echo "not set private protect public var"; echo "<br>"; var_dump($act); $act->output(); $attr = array('cUid'=>'234556', 'pId'=>'987676757', 'id'=> '782100'); initReferenceAttr($act, $attr); echo "<br>"; print_r($attr); echo "<br>"; echo "<br>"; echo "set private protect public var "; echo "<br>"; var_dump($act); echo "<br>"; $act->output();
在浏览器中,直接浏览test.php,内容大致如下:
not set private protect public var object(SellAction)#1 (3) { ["cUid":protected]=> NULL ["id":"SellAction":private]=> NULL ["pId"]=> NULL } output protected cUid : output private id : output public pId: Array ( [cUid] => 234556 [pId] => 987676757 [id] => 782100 ) set private protect public var object(SellAction)#1 (3) { ["cUid":protected]=> string(6) "234556" ["id":"SellAction":private]=> string(6) "782100" ["pId"]=> string(9) "987676757" } output protected cUid :234556 output private id :782100 output public pId:987676757
上面的demo主要是通过反射实现该功能。反射功能需要php版本>=5.3,反射的相关信息请参阅:http://php.net/manual/en/book.reflection.php

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安

为什么截图工具在Windows11上不起作用了解问题的根本原因有助于找到正确的解决方案。以下是截图工具可能无法正常工作的主要原因:对焦助手已打开:这可以防止截图工具打开。应用程序损坏:如果截图工具在启动时崩溃,则可能已损坏。过时的图形驱动程序:不兼容的驱动程序可能会干扰截图工具。来自其他应用程序的干扰:其他正在运行的应用程序可能与截图工具冲突。证书已过期:升级过程中的错误可能会导致此issu简单的解决方案这些适合大多数用户,不需要任何特殊的技术知识。1.更新窗口和Microsoft应用商店应用程

在java中,private的意思为“私有的”,是一种访问控制修饰符,用于修饰类、属性和方法。用private修饰的类成员,只能被该类自身的方法访问和修改,而不能被任何其他类(包括该类的子类)访问和引用;因此,private修饰符具有最高的保护级别。

在当今科技快速发展的时代,编程语言也如雨后春笋般涌现出来。其中一门备受瞩目的语言就是Go语言,它以其简洁、高效、并发安全等特性受到了许多开发者的喜爱。Go语言以其强大的生态系统而著称,其中有许多优秀的开源项目。本文将介绍五个精选的Go语言开源项目,带领读者一起探索Go语言开源项目的世界。KubernetesKubernetes是一个开源的容器编排引擎,用于自

Laravel是一个流行的PHP框架,具有高度可扩展性和高效性,它提供了很多强大的工具和库,让开发者可以快速构建高质量的Web应用程序。其中,LaravelEcho和Pusher是两个非常重要的工具,通过它们可以很容易地实现WebSockets通信,本文将详细介绍如何在Laravel应用程序中使用这两个工具。什么是WebSockets?WebSockets

目前最流行的Go框架有:Gin:轻量级、高性能的Web框架,简洁易用。Echo:快速、高度可定制的Web框架,提供高性能路由和中间件。GorillaMux:快速、灵活的多路复用器,提供高级路由配置选项。Fiber:性能优化的高性能Web框架,处理高并发请求。Martini:面向对象设计的模块化Web框架,提供丰富的功能集。

PHP中echo关键字的作用和使用方法详解PHP是一种广泛使用的服务器端脚本语言,它在网页开发中被广泛应用。而echo关键字是在PHP中用于输出内容的一种方法。本文将详细介绍echo关键字的作用和使用方法。作用:echo关键字的主要作用是将内容输出到浏览器。在网页开发中,我们需要将数据动态地呈现到前端页面上,这时就可以使用echo关键字将数据输出到页面上。e

《Go语言开发必备:5个热门框架推荐》Go语言作为一门快速、高效的编程语言,受到越来越多开发者的青睐。为了提高开发效率,优化代码结构,很多开发者选择使用框架来快速搭建应用。在Go语言的世界中,有许多优秀的框架可供选择。本文将介绍5个热门的Go语言框架,并提供具体的代码示例,帮助读者更好地理解和使用这些框架。1.GinGin是一个轻量级的Web框架,拥有快速
