簡體   English   中英

從幾個.php 文件中解包/合並 PHP 代碼

[英]Unwrap / amalgamate PHP code from several .php files

出於調試目的,在處理具有許多文件/許多include的 PHP 項目時(例如:Wordpress 代碼),我有時會對查看“解包”代碼感興趣,並合並/展平(“展平”是 Photoshop 中使用的術語-當您將多層合並為一層時的類似工具)所有文件到一個大的 PHP 文件中。

如何合並多個 PHP 文件?

例子:

$ php index.php --amalgamation

會將這些文件作為輸入:

  • vars.php

     <?php $color = 'green'; $fruit = 'apple'; ?>

    index.php

     <?php include 'vars.php'; echo "A $color $fruit"; ?>

並產生這個合並的 output:

<?php
$color = 'green';
$fruit = 'apple';
echo "A $color $fruit";
?>

(它也應該適用於許多文件,例如,如果index.php包含vars.php本身包含abc.php )。

我們可以編寫一個合並/捆綁腳本,它獲取給定文件的內容並匹配include|require的任何實例,然后獲取任何引用文件的內容,並將 include/require 調用替換為實際代碼。

以下是一個基本實現(基於對具有嵌套引用的文件的非常有限的測試),它適用於包含/需要其他文件的任意數量的文件。

<?php

// Main file that references further files:
$start = 'test/test.php';

function bundle_files(string $filepath)
{
    // Fetch current code
    $code = file_get_contents($filepath);
    
    // Set directory for referred files
    $dirname = pathinfo($filepath, PATHINFO_DIRNAME);
    
    // Match and substitute include/require(_once) with code:
    $rx = '~((include|require)(_once)?)\s+[\'"](?<path>[^\'"]+)[\'"];~';

    $code = preg_replace_callback($rx, function($m) use ($dirname) {
        // Ensure a valid filepath or abort:
        if($path = realpath($dirname . '/' . $m['path'])) {
            return bundle_files($path);         
        } else {
            die("Filepath Read Fail: {$dirname}/{$m['path']}");
        }
    }, $code);
    
    // Remove opening PHP tags, note source filepath
    $code = preg_replace('~^\s*<\?php\s*~i', "\n// ==== Source: {$filepath} ====\n\n", $code);
    
    // Remove closing PHP tags, if any
    $code = preg_replace('~\?>\s*$~', '', $code);   
    
    return $code;
}

$bundle = '<?php ' . "\n" . bundle_files($start);

file_put_contents('bundle.php', $bundle);
echo $bundle;

在這里,我們使用preg_replace_callback()按出現順序進行匹配和替換,回調在每個匹配的文件路徑上調用捆綁 function 並用實際代碼替換 include/require 引用。 function 還包括一個注釋行,指示包含文件的來源,如果/當您調試編譯的捆綁文件時,它可能會派上用場。

筆記/作業:

  • 您可能需要改進基本目錄引用例程。 (預計依賴 PHP include_path 的“不完整”文件路徑會出現問題。)
  • _once無法控制,代碼將被重新包含。 (通過記錄包含的文件路徑和跳過重復來輕松補救。)
  • 僅在"path/file.php"上進行匹配,即。 單/雙引號內的完整字符串。 連接的字符串不匹配。
  • 不理解包括變量或常量的路徑。 必須對文件進行評估,而不會產生副作用。 使之成為可能。
  • 如果你使用declare(strict_types=1); ,將其放在上面並消除以下實例。
  • 捆綁文件可能還有其他副作用,此處未解決。
  • 正則表達式不會向后/查看您的 include/require 是否被注釋掉!
  • 如果您的代碼跳入跳出 PHP 模式並脫口而出 HTML,則所有賭注都已取消
  • 管理包含自動加載的類超出了此代碼段。

請報告任何故障和邊緣情況。 隨意開發和(自由)分享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM