php中利用反射訪問類私有方法(php私有方法怎麼調用)

本文目錄一覽:

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-30 16:08
下一篇 2024-12-30 16:08

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進位的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進位。 一、AES加密介紹 AE…

    編程 2025-04-29
  • 用不同的方法求素數

    素數是指只能被1和自身整除的正整數,如2、3、5、7、11、13等。素數在密碼學、計算機科學、數學、物理等領域都有著廣泛的應用。本文將介紹幾種常見的求素數的方法,包括暴力枚舉法、埃…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • Python學習筆記:去除字元串最後一個字元的方法

    本文將從多個方面詳細闡述如何通過Python去除字元串最後一個字元,包括使用切片、pop()、刪除、替換等方法來實現。 一、字元串切片 在Python中,可以通過字元串切片的方式來…

    編程 2025-04-29
  • 用法介紹Python集合update方法

    Python集合(set)update()方法是Python的一種集合操作方法,用於將多個集合合併為一個集合。本篇文章將從以下幾個方面進行詳細闡述: 一、參數的含義和用法 Pyth…

    編程 2025-04-29

發表回復

登錄後才能評論