简化PHP命令行下接收参数

命令行下执行某个PHP脚本已是家常菜,大家也知道使用getopt接收参数(例子参考手册),但是它有一个缺点,必须先定义好需要接收哪些参数,并不能像$_GET/$_POST这么简单。
花了一些时间,写了一个类,让命令行参数像$_GET一样简单,随传随用。

class Options
{
    public static function get(string $name = '', $default = null)
    {
        static $argv = null;
        if (is_null($argv)) {
            [$shortopts, $longopts] = self::parse();
            $argv                   = getopt($shortopts, $longopts);
        }
        if ('' == $name) {
            return $argv;
        }
        return $argv[$name] ?? $default;
    }

    private static function parse(): array
    {
        if (empty($_SERVER['argv'])) {
            return [];
        }
        $opts = ['', []];
        foreach ($_SERVER['argv'] as $argv) {
            if (preg_match('/^\-\-([\w\-]+)/', $argv, $matches)) {
                $opts[1][] = $matches[1] . '::';
            } elseif (preg_match('/^\-([a-z])/', $argv, $matches)) {
                $opts[0] .= $matches[1] . '::';
            }
        }
        return $opts;
    }
}
php test.php --a=1 --b=2 -c3 -d4 -d5

全部接收

$options = Options::get();
var_dump($options);
/**
array(4) {
  ["a"]=>
  string(1) "1"
  ["b"]=>
  string(1) "2"
  ["c"]=>
  string(1) "3"
  ["d"]=>
  array(2) {
    [0]=>
    string(1) "4"
    [1]=>
    string(1) "5"
  }
}
*/

单个接收

echo Options::get('a');
// 1

使用默认值

echo Options::get('e', 1);
// 1

———————– 割 ———————–
在群里抛砖引玉,果然大牛们放出其他不错的方案。

【老王】环境变量的思路

AAAA=1111 php test.php
// 可得到 $_SERVER['AAAA'] = 1111

【supermoon】

php test.php "a=1&b=2"
// 结合parse_str()
打赏

发表评论

电子邮件地址不会被公开。 必填项已用*标注

You must enable javascript to see captcha here!