我有一个包含以下代码的index.php文件:
<?php
require_once __DIR__.'/asd1.php';
require_once __DIR__.'/asd2.php';
require_once __DIR__.'/asd3.php';
require_once __DIR__.'/asd4.php';
require_once __DIR__.'/asd5.php';
require_once __DIR__.'/asd6.php';
我想将require_once
中的index.php“编译”到一个PHP文件中。我希望编译结果在.php中而不是.phar中。
答案 0 :(得分:0)
嗨,我认为您的目的是进行一些预处理,例如C预处理程序,诸如搜索和替换表示包含内容的文件的字符串,因此我在下面编写代码,但请记住,该代码不是通用的,可能不适合当然,您可以将其作为实现其他目的的起点。
function preprocessing($path,$tempname=false){
$preprocessing=file($path);
foreach($preprocessing as &$values){
if(($x=strtolower(substr(($v=trim($values)),0,12)))=='require_once'||$x=='include_once'||substr($x,0,7)=='include'||substr($x,0,7)=='require'){
if($u=strpos($v,'(')){
$temp=substr($v,$u,strpos($v,')'));
$temp=trim(file_get_contents(eval('return '.$temp.';')));
if($temp){
if(substr($temp,0,5)==='<?php')
$temp=substr($temp,6);
if(substr($temp,0,2)==='<?')
$temp=substr($temp,3);
if(substr($temp,-2)==='?>')
$temp=substr($temp,0,-3);
$values=$temp;
}
unset($temp);
}else{
$temp=explode(' ',trim($v,';'));
$temp=trim(file_get_contents(eval('return '.end($temp).';')));
if($temp){
if(substr($temp,0,5)==='<?php')
$temp=substr($temp,6);
if(substr($temp,0,2)==='<?')
$temp=substr($temp,3);
if(substr($temp,-2)==='?>')
$temp=substr($temp,0,-3);
$values=$temp;
}
unset($temp);
}
}
}
if(!$tempname)
$tempname=uniqid().'.php';
file_put_contents($tempname, implode('',$preprocessing));
return $tempname;
}
function recursive_preprocessing($path){
$tempname=uniqid().'.php';
file_put_contents($tempname,'');
$i=0;
do{
$hash=sha1_file($tempname);
if($i==0)
$tempname=preprocessing($path,$tempname);
else
$tempname=preprocessing($tempname,$tempname);
$i++;
}while(sha1_file($tempname)!==$hash&&preg_match('#require|require_once|include|include_once#i',file_get_contents($tempname) ));
return $tempname;
}
print(recursive_preprocessing('index.php'));
第一个功能真的很简单。它获取主文件的路径并按预期生成一个新文件,然后将该路径返回该新文件。在此测试中,我只是将新路径打印到屏幕上以找到新文件。
第二个函数使用第一个函数递归替换所有包含,然后将路径返回到最终文件。 请记住,在这种状态下,只能将已解析的文件名替换为其内容。如果由于某种原因,预处理功能无法获取文件的内容,则包含语句将不会被替换。