首页 > 编程知识 正文

php中利用反射访问类私有方法(php私有方法怎么调用)

时间:2023-12-24 12:05:16 阅读:319929 作者:YYJR

本文目录一览:

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,然后执行方法

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。