在相对复杂的项目中,我们可以使用分层来减少代码耦合,并封装一些常用方法来加快开发速度. 因此,在实际开发中,代码可以分为: 控制器层,服务层,逻辑层,模型层等.

服务层: 所谓的服务层,我们可以理解为一个统一的输出层,控制器访问数据必须通过服务层进行访问,以保证数据访问的一致性. 因此,当数据结构发生变化时,我们只需要修改数据层或逻辑层,而控制器仅需要访问服务层,而不管逻辑层和模型层中的任何操作和更改.

在实际应用中,我们发现服务层和逻辑层中有很多重复的方法和代码. 那么php调用类的方法,有什么方法可以减少代码的重复性?

首先,我们使用php的__call方法将服务层的请求转移到逻辑层,那么如何在不知道该方法有多少参数的情况下调用该方法呢?

反射

即使将类成员定义为私有成员,也可以从外部访问它. 您也可以访问类成员和方法而无需创建类的实例.

PHP从5.0版开始增加了一种反射机制. 它提供了一组功能强大的反射API,使您可以在PHP运行时环境中访问和使用类,方法,属性,参数和注释. 它的功能非常强大. 它通常用于高扩展PHP框架中,自动加载插件,自动生成文档,甚至可以用于扩展PHP语言. 因为它是PHP的内置oop扩展,所以它是语言本身的功能,因此可以使用它而无需其他扩展或配置.

下面,我们使用PHP反射来实现php调用类的方法,而无需实例化逻辑层,调用其方法并完成结构返回.

首先,我们在__call中收到要调用的方法和传递的参数.

public function __call($func, $arguments)

{

return $this->invokeLogicObjectFunc($func, $arguments);

}

接下来,我们使用反射来实现调用过程:

final private function invokeLogicObjectFunc($func, $arguments)

{

$class = $this->logicLayer.$this->logicName;

if(!class_exists($class))

{

throw new Exception(class .$this->logicName. not exist);

}

$object = new \ReflectionClass($class);

if(!$object->hasMethod($func))

{

throw new Exception(method .$func. in class .$this->logicName.  is not exist);

}

$objectInstance = $object->newInstance();

$reflectionMethod = new \ReflectionMethod($class, $func);

//检测成员方法是否存在

if(empty($reflectionMethod))

{

throw new Exception(class .$this->logicName.  not exist method. $func);

}

//校验成员方法是否是public

if (!$reflectionMethod->isPublic()) {

throw new Exception(class . $this->logicName.  method is not allow access);

}

$parameters = $reflectionMethod->getParameters();

if (empty($parameters)) {

return $reflectionMethod->invoke($objectInstance);

} else {

return $reflectionMethod->invoke($objectInstance, ...$arguments);

}

}

注意: 调用也可以使用invokeArgs来实现.

此外,我们还可以使用PHP反射来实现API文档的主动生成(使用反射来获取批注,解析为API文档),自动调用类等.

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/ruanjian/article-254676-1.html

php反射执行方法名,PHP使用反射(ReflectionClass)调用其他类的方法相关推荐

  1. Java反射机制demo(五)—获得并调用一个类中的方法

    这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和运行结果.获取所有的方法使用Class类中getMetho ...

  2. php引用公有类方法_PHP 利用反射(ReflectionClass)调用其他类的方法 | 剑花烟雨江南...

    在相对复杂的项目中,我们可以利用分层来降低代码的耦合,并封装一些公用的方法,加快我们的开发速度.因此,在实际开发中,可以将代码分为: 控制器层.服务层.逻辑层.模型层等等.... 服务层: 所谓的服务 ...

  3. java反射调用接口方法参数_Java反射调用某个类的方法(带参数和不带参数)

    不多说,直接贴代码,不懂查API,现在就列取要用的方法和类. Class类: public Method getDeclaredMethod(String name, Class>... par ...

  4. java反射调用某个类的方法(带参或不带参)

    Class类: public getDeclaredMethod( name,                                  <?>... parameterTypes ...

  5. oracle 执行java_oracle调用JAVA类的方法

    oracle调用JAVA类的方法主要有以下三种: 1. 用loadjava方法装载: 可能是调试方便,据说这种方法比较通用. c:\test\hello.java public class hello ...

  6. Java通过反射执行方法

    要动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 Method 类型的对象或者数组. getMethods()getMethods(String name,Class<?> ...

  7. 第十九章《类的加载与反射》第3节:反射

    JAVA的反射机制是指在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性.这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的 ...

  8. java 反射执行语句_JAVA反射机制

    JAVA反射机制定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的 ...

  9. Spring Boot SchedulingConfigurer定时执行任务(配置式反射调用)

    目录 1.背景 2.简介 3.代码实现 3.1.主类 3.2.配置类 3.3.配置示例 1.背景 定时任务注解@Scheduled(cron="0 0/10 * * * ?")大家 ...

最新文章

  1. linux 内核 时间片,能讲一下在Linux系统中时间片是怎么分配的还有优先级的具体算法是...
  2. 引发热议的AI翻译歧视,是理所应当的事么?
  3. JavaScript(九)正则表达式
  4. 使用AOP与注解记录Java日志
  5. QML和C ++之间的数据类型转换
  6. 微服务发现组件Eureka:微服务注册
  7. slice_Spring Boot Web Slice测试–示例
  8. [leetcode]从中序与后序/前序遍历序列构造二叉树
  9. Jira-Clone与发邮件的使用
  10. HDU 3394 Railway(点双连通分量)
  11. 2016 【第七届蓝桥杯省赛】 C/C++ B组
  12. 快速安装rubyinstaller-devkit
  13. Fluent Python读后感
  14. 计算机病毒无法破坏压缩文件,求解压缩文件拒绝访问是怎么回事?
  15. 比arduino更简单易用的开发板ShineBlink,零代码上云,像搭积木一样开发物联网产品
  16. Codeforces Round #521 (Div. 3) B - Disturbed People (贪心)
  17. 基于LayUI使用FullCalendar实现日程管理
  18. python中bd是什么属性_聊一聊:Python中对象的属性
  19. 带你认识什么是一级指针、二级指针、三级指针
  20. 智联招聘python岗位_python智联招聘爬虫

热门文章

  1. 我的4g网卡运行着GNU/Linux -- 某4g无线网卡的逆向工程与主线Linux移植 (一)
  2. LaTex论文格式模板
  3. matlab 虚拟测量实验报告,实验报告格式
  4. 非格式化容量和格式化容量的计算
  5. python ui自动化测试框架_一个开源的面向.Net 桌面应用的 Python 封装自动化测试框架...
  6. 提高计算机专业技能,如何提高计算机专业学生综合技能.doc
  7. 读《远见:如何规划职业生涯3大阶段》
  8. 10月国内电脑分辨率十强:1920*1080占比破15%
  9. 索引是什么,有什么用,怎么用?
  10. VC中,AssertValid和Dump函数