您的位置:首页 > 编程语言 > PHP开发

沈逸老师PHP魔鬼特训笔记(11)

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

  首先为了防止队友乱来,我们规定在队友,如果在网站里写函数必须以 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: