在许多编程语言中,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 时很实用。
理解参数传递机制,有助于写出更加健壮和灵活的命令行脚本。