选择语言 :

 Core_Controller_Shell::getopt

获取shell命令下参数

与getopt()具体相似的功能,区别:在命令行中如果执行 php index.php default test -a=1 -b=c 这样的命令时,通过getopt()会获取参数失败,而这个方法可以正确获得相应的参数

示例:
在默认项目Shell控制器中加入一个test控制器文件 ( projects/default/controller_shell/test.controller.php ) 内容为:

<?php
class Controller_Test extends Controller_Shell
{
    public function action_run()
    {
        $shortopts  = "";
        $shortopts .= "f:";  // 必须有值, 比如:-f myvalue,将会得到f=myvalue
        $shortopts .= "v::"; // 可接受值, 比如:-v 则v=false,如果是-v=myvalue,则v=myvalue
        $shortopts .= "abc"; // 不接受值, 比如:-a -v 则获取a=false,v=false,注意,这个并不是接受-abc的参数,而是分别可接受-a,-b,-c

        $longopts  = array
        (
            "required:",     // 必须有值, 比如:--required=abc
            "optional::",    // 可接受值, 比如:--optional 则获取 optional=false,--optional=abc,则是optional=abc
            "option",        // 不接受值, 比如:--option 则获取 option=false
            "opt",           // 同上
        );

        $options = self::getopt($shortopts, $longopts);
        var_dump($options);
    }
}

通过 php index.php default test run -f "value for f" -v -a --required value --optional="optional value" --option 运行以上脚本会输出

array(6) {
  ["f"]=> string(11) "value for f"
  ["v"]=> bool(false)
  ["a"]=> bool(false)
  ["required"]=> string(5) "value"
  ["optional"]=> string(14) "optional value"
  ["option"]=> bool(false)
}
array Core_Controller_Shell::getopt( string $options [, array $global_options = null ] )
link
http://cn.php.net/getopt

参数列表

参数 类型 描述 默认值
$options string 但字符参数,只接受[a-zA-Z0-9]的参数,比如 -a, -h, -v=myvalue, -4 这样
$global_options array --参数,比如--test, --help, --v=abc 这样 null
返回值
  • array 返回获取到的参数的数组
File: ./core/controllers-shell/shell.controller.php
public static function getopt($options, array $global_options = null)
{
    $argv = $_SERVER['argv'];
    array_shift($argv);

    foreach($argv as $key => $item)
    {
        if ($item[0]=='-')
        {
            # 读取到第一个带-参数的值
            break;
        }
        unset($argv[$key]);
    }
    $argv = array_values($argv);


    $len = strlen($options);
    $my_options = array();

    $sl = 0;
    for($i=$len-1; $i>=0; $i--)
    {
        $key = $options[$i];
        if ($key==':')
        {
            $sl++;
            continue;
        }

        # 只接受a-zA-Z0-9
        if (preg_match('#[^a-zA-Z0-9]+#', $key))continue;

        if ($sl===0)
        {
            $my_options[$key] = 1;
        }
        elseif ($sl===1)
        {
            $my_options[$key.':'] = 1;
        }
        else
        {
            $my_options[$key.'::'] = 1;
        }

        $sl = 0;
    }

    $my_global_options = array();
    foreach($global_options as $item)
    {
        $my_global_options[$item] = 1;
    }

    $rs = array();

    foreach($argv as $k=>$item)
    {
        if (preg_match('#^\-(\-)?([a-z0-9\-]+)=(.*)$#i', $item, $m))
        {
            $key   = $m[2];
            $value = $m[3];
            if ($m[1]=='-')
            {
                if (!isset($my_global_options[$key.'::']))
                {
                    continue;
                }
            }
            else
            {
                if (!isset($my_options[$key.'::']))
                {
                    continue;
                }
            }
        }
        elseif (preg_match('#^\-(\-)?([a-z0-9\-]+)$#i', $item, $m))
        {
            $key  = $m[2];
            if ($m[1]=='-')
            {
                if (isset($my_global_options[$key]))
                {
                    $value = false;
                }
                elseif (isset($my_global_options[$key.':']))
                {
                    $value = $argv[$k+1];
                }
                else
                {
                    continue;
                }
            }
            else
            {
                if (isset($my_options[$key]))
                {
                    $value = false;
                }
                elseif (isset($my_options[$key.':']))
                {
                    $value = $argv[$k+1];
                }
                elseif (isset($my_options[$key.'::']))
                {
                    $value = false;
                }
                else
                {
                    continue;
                }
            }
        }
        else
        {
            continue;
        }

        if (isset($rs[$key]))
        {
            $rs[$key] = (array)$rs[$key];
            $rs[$key][] = $value;
        }
        else
        {
            # 赋值
            $rs[$key] = $value;
        }
    }

    return $rs;
}