在許多編程語言中, 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時很實用。
理解參數傳遞機制,有助於寫出更加健壯和靈活的命令行腳本。