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)

  • 相关阅读:
    Composite in Javascript
    Model Validation in Asp.net MVC
    HttpRuntime.Cache vs. HttpContext.Current.Cache
    Controller Extensibility in ASP.NET MVC
    The Decorator Pattern in Javascript
    The Flyweight Pattern in Javascript
    Model Binding in ASP.NET MVC
    Asp.net MVC
    jQuery Ajax 实例 全解析
    ASP.NET AJAX入门系列
  • 原文地址:https://www.cnblogs.com/xz1024/p/5852967.html
Copyright © 2011-2022 走看看