zoukankan      html  css  js  c++  java
  • php反射

      反射是在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。
    其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。
    php反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。
          反射api是php内建的oop技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些oop扩展被称为反射。
          通过ReflectionClass,我们可以得到Person类的以下信息:
         1)常量 Contants
         2)属性 Property Names
         3)方法 Method Names静态
         4)属性 Static Properties
         5)命名空间 Namespace
         6)Person类是否为final或者abstract

    然后就去看了看thinkphp的源码,对于MVC的实现也有不同的体验  ThinkPHPLibCoreApp.class.php 中的exec方法

            if(!preg_match('/^[A-Za-z](w)*$/',$action)){
                    // 非法操作
                    throw new ReflectionException();
                }
                //执行当前操作
                $method =   new ReflectionMethod($module, $action);   #查看方法
                if($method->isPublic()) {
                    $class  =   new ReflectionClass($module);  #反射控制器
                    // 前置操作
                    if($class->hasMethod('_before_'.$action)) {
                        $before =   $class->getMethod('_before_'.$action);
                        if($before->isPublic()) {
                            $before->invoke($module);
                        }
                    }
                    // URL参数绑定检测
                    if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){
                        switch($_SERVER['REQUEST_METHOD']) {
                            case 'POST':
                                $vars    =  $_POST;
                                break;
                            case 'PUT':
                                parse_str(file_get_contents('php://input'), $vars);
                                break;
                            default:
                                $vars  =  $_GET;
                        }
                        $params =  $method->getParameters();
                        foreach ($params as $param){
                            $name = $param->getName();
                            if(isset($vars[$name])) {
                                $args[] =  $vars[$name];
                            }elseif($param->isDefaultValueAvailable()){
                                $args[] = $param->getDefaultValue();
                            }else{
                                throw_exception(L('_PARAM_ERROR_').':'.$name);
                            }
                        }
                        $method->invokeArgs($module,$args);
                    }else{
                        $method->invoke($module); #执行我们需要调用函数
                    }
                    // 后置操作
                    if($class->hasMethod('_after_'.$action)) {
                        $after =   $class->getMethod('_after_'.$action);
                        if($after->isPublic()) {
                            $after->invoke($module);
                        }
                    }
  • 相关阅读:
    LeetCode OJ 107. Binary Tree Level Order Traversal II
    LeetCode OJ 116. Populating Next Right Pointers in Each Node
    LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
    LeetCode OJ 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode OJ 98. Validate Binary Search Tree
    老程序员解Bug的通用套路
    转载 四年努力,梦归阿里,和大家聊聊成长感悟
    转载面试感悟----一名3年工作经验的程序员应该具备的技能
    Web Service和Servlet的区别
    关于spring xml文件中的xmlns,xsi:schemaLocation
  • 原文地址:https://www.cnblogs.com/waited/p/5272228.html
Copyright © 2011-2022 走看看