沈逸老师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)

posted @ 2016-09-08 14:34  前进的卒子  阅读(325)  评论(0编辑  收藏  举报