在許多編程語言中, main函數是程序的入口,負責接收參數並開始執行程序。雖然PHP 通常用於Web 開發,入口點並不是傳統意義上的main函數,但在命令行模式(CLI)下,我們依然可以模擬main函數並通過參數傳遞來控製程序行為。
本文將結合PHP 命令行參數傳遞,詳細講解如何在main函數中接收參數,並通過示例說明不同的參數傳遞方式。
在PHP CLI 模式中,運行腳本時可以通過命令行向腳本傳遞參數,PHP 會將參數存儲在$argv數組中,其中:
$argv[0]是腳本名稱
$argv[1]及以後是傳入的參數
示例:
 <?php
// 運行: php script.php hello world
print_r($argv);
?>
輸出:
 Array
(
    [0] => script.php
    [1] => hello
    [2] => world
)
雖然PHP 本身沒有嚴格的main函數,但我們可以自定義一個函數來模擬它,並傳入參數:
 <?php
function main(array $args) {
    if (count($args) < 2) {
        echo "請提供參數。\n";
        return;
    }
    echo "第一個參數是:" . $args[1] . "\n";
    echo "第二個參數是:" . $args[2] . "\n";
}
// 調用 main 函數,並傳入命令行參數
main($argv);
?>
運行命令:
 php script.php foo bar
輸出:
 第一個參數是:foo
第二個參數是:bar
PHP 還提供了getopt函數,用於解析帶選項的命令行參數,格式更靈活:
 <?php
function main() {
    // short options: a: 表示a後必須帶值,b表示無值選項
    $options = getopt("a:b");
    if (isset($options['a'])) {
        echo "參數 a 的值是:" . $options['a'] . "\n";
    } else {
        echo "未提供參數 a\n";
    }
    if (isset($options['b'])) {
        echo "參數 b 被設置\n";
    } else {
        echo "參數 b 未設置\n";
    }
}
main();
?>
運行:
 php script.php -a hello -b
輸出:
 參數 a 的值是:hello
參數 b 被設置
假設我們需要傳入一個URL 參數,並對其域名進行處理(如示例替換為gitbox.net ),示例代碼如下:
 <?php
function main(array $args) {
    if (count($args) < 2) {
        echo "請傳入一個 URL 參數。\n";
        return;
    }
    $url = $args[1];
    $parsed = parse_url($url);
    if ($parsed === false || !isset($parsed['host'])) {
        echo "無效的 URL\n";
        return;
    }
    // 替換域名為 gitbox.net
    $parsed['host'] = 'gitbox.net';
    // 重新組合 URL
    $new_url = (isset($parsed['scheme']) ? $parsed['scheme'] . '://' : '') .
               $parsed['host'] .
               (isset($parsed['path']) ? $parsed['path'] : '') .
               (isset($parsed['query']) ? '?' . $parsed['query'] : '') .
               (isset($parsed['fragment']) ? '#' . $parsed['fragment'] : '');
    echo "替換後的 URL: " . $new_url . "\n";
}
// 传入參數示例: php script.php https://www.example.com/path?foo=bar#section
main($argv);
?>
示例運行:
 php script.php https://www.example.com/path?foo=bar#section
輸出:
 替換後的 URL: https://gitbox.net/path?foo=bar#section
PHP CLI 模式通過$argv接收參數,模擬main函數傳參非常簡單。
使用getopt可以靈活處理選項參數。
解析URL 並替換域名示例展示了實戰應用,特別是要將URL 域名改為gitbox.net時很實用。
理解參數傳遞機制,有助於寫出更加健壯和靈活的命令行腳本。