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脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++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應用程式商店應用程

在現今科技快速發展的時代,程式語言也如雨後春筍般湧現。其中一門備受矚目的語言就是Go語言,它以其簡潔、高效、並發安全等特性受到了許多開發者的喜愛。 Go語言以其強大的生態系統而著稱,其中有許多優秀的開源專案。本文將介紹五個精選的Go語言開源項目,帶領讀者一起探索Go語言開源專案的世界。 KubernetesKubernetes是一個開源的容器編排引擎,用於自

在java中,private的意思為“私有的”,是一種存取控制修飾符,用於修飾類別、屬性和方法。用private修飾的類別成員,只能被該類別本身的方法存取和修改,而不能被任何其他類別(包括該類別的子類別)存取和引用;因此,private修飾符具有最高的保護等級。

《Go語言開發必備:5個熱門框架推薦》Go語言作為一門快速、高效的程式語言,受到越來越多開發者的青睞。為了提高開發效率,優化程式碼結構,許多開發者選擇使用框架來快速建立應用。在Go語言的世界中,有許多優秀的框架可供選擇。本文將介紹5個熱門的Go語言框架,並提供具體的程式碼範例,幫助讀者更好地理解和使用這些框架。 1.GinGin是一個輕量級的Web框架,擁有快速

第1部分:初始故障排除步驟檢查蘋果的系統狀態:在深入研究複雜的解決方案之前,讓我們先從基礎知識開始。問題可能不在於您的設備;蘋果的伺服器可能會關閉。造訪Apple的系統狀態頁面,查看AppStore是否正常運作。如果有問題,您所能做的就是等待Apple修復它。檢查您的網路連接:確保您擁有穩定的網路連接,因為「無法連接到AppStore」問題有時可歸因於連接不良。嘗試在Wi-Fi和行動數據之間切換或重置網路設定(「常規」>「重置」>「重置網路設定」>設定)。更新您的iOS版本:

PHP中echo關鍵字的作用和使用方法詳解PHP是一種廣泛使用的伺服器端腳本語言,它在網頁開發中被廣泛應用。而echo關鍵字是在PHP中用來輸出內容的一種方法。本文將詳細介紹echo關鍵字的作用與使用方法。作用:echo關鍵字的主要作用是將內容輸出到瀏覽器。在網頁開發中,我們需要將資料動態地呈現到前端頁面上,這時就可以使用echo關鍵字將資料輸出到頁面上。 e

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code
