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

  • 相关阅读:
    Cypress系列(74)- each() 命令详解
    Cypress系列(73)- within() 命令详解
    实战-电力窃露漏电用户自动识别
    谷歌colab切换使用tensorflow1.x版本
    解决pip安装tensorflow下载缓慢问题
    如何将tensorflow1.x代码改写为pytorch代码(以图注意力网络(GAT)为例)
    graph attention network(ICLR2018)官方代码详解(tensorflow)-稀疏矩阵版
    graph attention network(ICLR2018)官方代码详解(tensorflow)
    DGL中文文档
    graphSAGE的python实现
  • 原文地址:https://www.cnblogs.com/xz1024/p/5852967.html
Copyright © 2020-2023  润新知