本文目錄一覽:
- 1、php怎麼訪問對象中的private
- 2、php如何通過子類繼承父類共有方法訪問父類私有屬性
- 3、反射調用private方法實踐(php、java)
- 4、反射機制訪問私有方法代碼異常”java.lang.ClassCastException”
- 5、php中怎麼類外訪問私有方法?
- 6、在一個類中如何調用另一個類的私有方法
php怎麼訪問對象中的private
私有屬性方法在對象外不能訪問,在對象內可以訪問,那麼你可以寫一個共有public的方法,在方法里對對象里的私有屬性方法採取調用就可以了。所謂私有就是避免對象外的亂改,加個方法起限制
php如何通過子類繼承父類共有方法訪問父類私有屬性
在父類中加個public方法,
如private $aaa = ‘test’;
public function getAAA(){
return $this-aaa;
}
在子類中調用parent::getAAA();就可以獲得父類私有屬性
當然如果你想獲取多個,可以改成動態變數名,
getAAA($v){
return $this-{$v};
}
反射調用private方法實踐(php、java)
單測中有個普遍性的問題,被側類中的private方法無法直接調用。小拽在處理過程中通過反射改變方法許可權,進行單測,分享一下,直接上代碼。
簡單被測試類
生成一個簡單的被測試類,只有個private方法。
複製代碼
代碼如下:
?php/**
*
崔小渙單測的基本模板。
*
*
@author
cuihuan
*
@date
2015/11/12
22:15:31
*
@version
$Revision:1.0$
**/class
MyClass
{/**
*
私有方法
*
*
@param
$params
*
@return
bool
*/private
function
privateFunc($params){if(!isset($params)){return
false;}echo
“test
success”;return
$params;}}
單測代碼
複製代碼
代碼如下:
?php/***************************************************************************
*
*
$Id:
MyClassTest
T,v
1.0
PsCaseTest
cuihuan
Exp$
*
**************************************************************************//**
*
崔小渙單測的基本模板。
*
*
@author
cuihuan
*
@date
2015/11/12
22:09:31
*
@version
$Revision:1.0$
**/require_once
(‘./MyClass.php’);class
MyClassTest
extends
PHPUnit_Framework_TestCase
{const
CLASS_NAME
=
‘MyClass’;const
FAIL
=
‘fail’;protected
$objMyClass;/**
*
@brief
setup:
Sets
up
the
fixture,
for
example,
opens
a
network
connection.
*
*
可以看做phpunit的構造函數
*/public
function
setup()
{date_default_timezone_set(‘PRC’);$this-objMyClass
=
new
MyClass();}/**
*
利用反射,對類中的private
和
protect
方法進行單元測試
*
*
@param
$strMethodName
string
:反射函數名
*
@return
ReflectionMethod
obj
:回調對象
*/protected
static
function
getPrivateMethod($strMethodName)
{$objReflectClass
=
new
ReflectionClass(self::CLASS_NAME);$method
=
$objReflectClass-getMethod($strMethodName);$method-setAccessible(true);return
$method;}/**
*
@brief
:測試private函數的調用
*/public
function
testPrivateFunc(){$testCase
=
‘just
a
test
string’;//
反射該類$testFunc
=
self::getPrivateMethod(‘privateFunc’);$res
=
$testFunc-invokeArgs($this-objMyClass,
array($testCase));$this-assertEquals($testCase,
$res);$this-expectOutputRegex(‘/success/i’);//
捕獲沒有參數異常測試try
{
$testFunc-invokeArgs($this-transfer2Pscase,
array());}
catch
(Exception
$expected)
{$this-assertNotNull($expected);return
true;}$this-fail(self::FAIL);}}
運行結果
cuihuan:test
cuixiaohuan$
phpunit
MyClassTest.php
PHPUnit
4.8.6
by
Sebastian
Bergmann
and
contributors.Time:
103
ms,
Memory:
11.75MbOK
(1
test,
3
assertions)
關鍵代碼分析
封裝了一個,被測類方法的反射調用;同時,返回方法之前處理方法的接入許可權為true,便可以訪問private的函數方法。
複製代碼
代碼如下:
/**
*
利用反射,對類中的private
和
protect
方法進行單元測試
*
*
@param
$strMethodName
string
:反射函數名
*
@return
ReflectionMethod
obj
:回調對象
*/protected
static
function
getPrivateMethod($strMethodName)
{$objReflectClass
=
new
ReflectionClass(self::CLASS_NAME);$method
=
$objReflectClass-getMethod($strMethodName);$method-setAccessible(true);return
$method;}
下面給大家分享java中利用反射調用另一類的private方法
我們知道,Java應用程序不能訪問持久化類的private方法,但Hibernate沒有這個限制,它能夠訪問各種級別的方法,如private,
default,
protected,
public.
Hibernate是如何實現該功能的呢?答案是利用JAVA的反射機制,如下:
span
style=”font-size:14px;”import
java.lang.reflect.InvocationTargetException;
import
java.lang.reflect.Method;
public
class
ReflectDemo
{
public
static
void
main(String[]
args)
throws
Exception
{
Method
method
=
PackageClazz.class.getDeclaredMethod(“privilegedMethod”,
new
Class[]{String.class,String.class});
method.setAccessible(true);
method.invoke(new
PackageClazz(),
“452345234”,”q31234132″);
}
}
class
PackageClazz
{
private
void
privilegedMethod(String
invokerName,String
adb)
{
System.out.println(“—“+invokerName+”—-“+adb);
}
}/span
輸出結果為:—452345234—-q31234132
反射機制訪問私有方法代碼異常”java.lang.ClassCastException”
Class clazz = loader.loadClass(“com.baobaotao.reflect.PrivateCar”);
PrivateCar pcar = (PrivateCar)clazz.newInstance(); // package com.testspring.reflect;
雖然類名相同,但包名不同,不是同一個類,所以不能轉換。
Java中只有類的和包名完全相同,才是同一個類。
改為:
com.baobaotao.reflect.PrivateCar pcar = (com.baobaotao.reflect.PrivateCar)clazz.newInstance();
或者
Class clazz = loader.loadClass(“com.testspring.reflect.PrivateCar”);
php中怎麼類外訪問私有方法?
你問的是私有方法還是私有屬性?
你說的__get __set 是訪問和設置屬性用的。
__call才是訪問方法用的。
但這兩種都需要修改原始類,既然有這個許可權了,那私有方法有什麼必要定義呢?
另外一種獲取私有屬性或調用私有方法的思路是通過反射:
//MyClass這個類中包含了一個名為myFun的私有方法
class MyClass {
private $tmp = ‘hello’;
private function myFun()
{
echo $this-tmp . ‘ ‘ . ‘world!’;
}
}
//通過類名MyClass進行反射
$ref_class = new ReflectionClass(‘MyClass’);
//通過反射類進行實例化
$instance = $ref_class-newInstance();
//通過方法名myFun獲取指定方法
$method = $ref_class-getMethod(‘myFun’);
//設置可訪問性
$method-setAccessible(true);
//執行方法
$method-invoke($instance);
//獲取屬性
$property = $ref_class-getProperty(‘tmp’);
//列印屬性
var_dump($property);
不知道你提這個單純是個問題,還是有別的需求,可以多看看php手冊學習一下。
php 訪問控制
php 反射
在一個類中如何調用另一個類的私有方法
利用反射在外部類生成調用類的對象,然後獲取調用方法,並修改Accessible,然後執行方法
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/301278.html