zoukankan      html  css  js  c++  java
  • 沈逸老师PHP魔鬼特训笔记(11)

      上节课我们“编译”的是 变量集合 如果还有函数该怎么办呢? 函数有个好处,如果重复定义会出错。我们今天要做的就是把散落在各个地方的函数归类。

      首先为了防止队友乱来,我们规定在队友,如果在网站里写函数必须以 func.php作为文件后缀。 譬如 common.func.php。我们写入两个测试函数文件名 在里面分别写入不同的测试函数。

       if(preg_match("/w+.(var|func).php$/i",$_file)) 。注意 (var|func) 是正则,代表要么是var要么是func 这样我们就可以读取出这两者文件,进行统一require了。

      上节课我们学习到了get_defined_vars()获取所有 定义过的变量 这节课我们怎么获取所有定义过的函数呢?请看下面标红的代码: 

        function compile(){ //将code里的重复变量读取出来处理掉
           $_files = scandir($this -> project_folder.'/code');
           foreach($_files as $_file){
               if(preg_match("/w+.var|func.php$/i",$_file)){
                   require ($this->project_folder.'/code/'.$_file);
                   unset($_file);
               }
           }
            unset($_files);//销毁这个无效的变量
            //var_export(get_defined_vars());
            $result = '<?php '.PHP_EOL
                .'ectract('.var_export(get_defined_vars(),1).');';
            file_put_contents($this->project_folder."/vars.php",$result);
    
            $f = new ReflectionFunction('showName');
            echo $f->getFileName();
        }

      

      我们要获取函数的源码,然后归并在某个统一的文件里,因此我们需要知道如下两点: 1) 该函数所在的文件启始行 2)该函数所在文件的末尾行 3、然后用各种方法截取一下即可啦。

       根据手册我们可以知道:

    $f=new ReflectionFunction("showName");
    $start=$f->getStartLine(); //获取该函数的启始行号 
    $end=$f->getEndLine(); //获取该函数的末尾行号     

      于是,我们在compile方法中加入以下代码,并测试,看下

            $f = new ReflectionFunction('showName');
            $start = $f->getStartLine();    //获取该函数的启始行号
            $end = $f->getEndLine();        //获取该函数的末尾行号
            $fileList = file($f-> getFileName());
            var_export($fileList);

      

      最后把这个方法整理下:

    function compile(){ //将code里的重复变量读取出来处理掉
           $_files = scandir($this -> project_folder.'/code');
           foreach($_files as $_file){
               if(preg_match("/w+.var|func.php$/i",$_file)){
                   require ($this->project_folder.'/code/'.$_file);
                   unset($_file);
               }
           }
            unset($_files);//销毁这个无效的变量
            //var_export(get_defined_vars());
            $result = '<?php '.PHP_EOL
                .'ectract('.var_export(get_defined_vars(),1).');';
            file_put_contents($this->project_folder."/vars.php",$result);
            
            $getFunc = get_defined_functions();
            foreach ($getFunc as $func){
                
            }
            
            $f = new ReflectionFunction('showName');
            $start = $f->getStartLine();    //获取该函数的启始行号
            $end = $f->getEndLine();        //获取该函数的末尾行号
            $fileList = file($f-> getFileName());
            echo implode(array_slice($fileList,$start-1,$end-$start+1));
        }

    知识点:一、get_defined_functions();

        经过测试我们会发现里面包含两个子集

                 1、internal (PHP内置函数)

          2、user(用户自定义函数,这是我们要取的)

         

                 二、ReflectionFunction类报告了一个函数的有关信息 这是一个反射类。

         

         三、file(文件名) 把整个文件读入一个数组中(“数组索引加上1”就是行号)

         四、 array_slice (array,start,length)    

         五、 implode(explode)

  • 相关阅读:
    POJ3280Cheapest palindrome 经典dp
    hdu1257 最少拦截系统 LIS的应用
    代码着色 test
    Delphi 线程中的 Synchronize 和 临界区TCriticalSection 区别
    Delphi float浮点值转换整型int 方法
    Win.ini 介绍和配置结构
    Delphi Win API 打印函数 WriteProfileString
    Delphi ADOQuery 的Open和ExecSQL有什么区别
    SQL Server 中的 @、@@、#、## 、N 代表什么,以及SQL系统常用全局变量
    SQL 返回新增行的自增ID值方法
  • 原文地址:https://www.cnblogs.com/xz1024/p/5852967.html
Copyright © 2011-2022 走看看