上节课我们“编译”的是 变量集合 如果还有函数该怎么办呢? 函数有个好处,如果重复定义会出错。我们今天要做的就是把散落在各个地方的函数归类。
首先为了防止队友乱来,我们规定在队友,如果在网站里写函数必须以 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)