[英]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 還包括一個注釋行,指示包含文件的來源,如果/當您調試編譯的捆綁文件時,它可能會派上用場。
筆記/作業:
_once
無法控制,代碼將被重新包含。 (通過記錄包含的文件路徑和跳過重復來輕松補救。)"path/file.php"
上進行匹配,即。 單/雙引號內的完整字符串。 連接的字符串不匹配。declare(strict_types=1);
,將其放在上面並消除以下實例。請報告任何故障和邊緣情況。 隨意開發和(自由)分享。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.