如何将PHP文件合并为一个PHP文件(不是.phar)?

时间:2018-08-02 13:01:04

标签: php

我有一个包含以下代码的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中。

1 个答案:

答案 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'));

第一个功能真的很简单。它获取主文件的路径并按预期生成一个新文件,然后将该路径返回该新文件。在此测试中,我只是将新路径打印到屏幕上以找到新文件。

第二个函数使用第一个函数递归替换所有包含,然后将路径返回到最终文件。 请记住,在这种状态下,只能将已解析的文件名替换为其内容。如果由于某种原因,预处理功能无法获取文件的内容,则包含语句将不会被替换。