php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数及

一、php在cli模式下取得命令行中的参数的方法-getopt命令行可传递数组-简单自定义方法取命令行参数

1. php在cli模式下取得命令行中的参数的方法

    在cli模式下执行PHP时,自动给脚本文件传递了一个变量$argv,其值即是一个命令中所有值组成的数组(以空格区分),在PHP程序中接收参数有3种方法(publish:May 11, 2017 -Thursday)

1.直接使用argv变量数组。 
2.使用$_SERVER['argv']全局变量来获取,其值和1是一样的。
3.使用getopt方法

#getopt方法格式
array getopt ( string $options [, array $longopts ] )

options:该字符串中的每个字符会被当做选项字符,匹配传入脚本的选项以单个连字符(-)开头。 选项字符串只允许 a-z、A-Z 和 0-9。

    示例:print_r(getopt('a:b::c'));将会得到一个数组,其后面的冒号规则如下:
    •单独的字符(不接受值)
    •后面跟随冒号的字符(此选项需要值)
    •后面跟随两个冒号的字符(此选项的值可选)

    所以:getopt('a:b::c')即表示a是需要的值,b是可选值,c是不要的值(传了也置空)。注:选项的值是字符串后的第一个参数。它不介意值之前是否有空格。PHP程序示例:

<?php
print_r(getopt('a:b::c'));
echo "\n--------------------\n";

入参命令及显示结果:你会发现也有一些现象:

[root@123 ~]# php a.php -a=1 -b=5 -c=6 -d=4   
Array
(
    [a] => 1
    [b] => 5
    [c] => 
)
--------------------
#结果:遇到不接受的c后,后面的参数都不会再处理。
[root@123 ~]# php a.php -a 1 -b=5 -c=6 -d=4 
Array
(
    [a] => 1
    [b] => 5
    [c] => 
)
--------------------
[root@123 ~]# php a.php -a 1 -b5 -c=6 -d=4 
Array
(
    [a] => 1
    [b] => 5
    [c] => 
)
--------------------
[root@123 ~]# php a.php -a 1 -b 5 -c=6 -d=4 
Array
(
    [a] => 1
    [b] => 
)
--------------------

#为什么上面的-b后面用空格会导致b取不到结果?文档明明写着=和空格都是可以的。
#我试验感觉有这么一个规律:最后一个值不能和参数有空格。

2. getopt命令行可传递数组 

     写到这里我真感觉这不是一个什么好方法!真够麻烦的,而且这个单字符传参没可读性,不过还是提一下,我在使用的时候发现命令行里还可以传递数组的,比如你可以传递-a=1后,再接着传一个-a=5,则得到的-a自动变成一个二维数组,包含两个值。不过觉得意义不大。接下来再看longopts:

    longopts:选项数组。此数组中的每个元素会被作为选项字符串,匹配了以两个连字符(--)传入到脚本的选项。因为options只允许单个字符,而这在程序中没有什么可读性,当然不可取。所以有必要使用longopts。

    options 和 longopts 的格式几乎是一样的,唯一的不同之处是 longopts 需要是选项的数组(每个元素为一个选项) 
PHP程序示例:

<?php
print_r(getopt('',array('type:')));

结果示例:

[root@123 ~]# php a.php --id 101 --type=1 --age=4 
Array
(
    [id] => 101
    [type] => 1
    [age] => 
)
--------------------
[root@123 ~]# php a.php --id 101 --type 1 --age=4 
Array
(
    [id] => 101
    [type] => 
)
--------------------
#仍是一样:最后一个值不能和参数有空格。

3. 简单自定义方法取命令行参数

    真心觉得longopts一样也是一个麻烦的东西,真不知道getopt有什么卖点,既然$argv能取到值那么在PHP里使用一个方法一下子就得到键值不就行了。于是我试着用这么一个方法:

<?php
function getClientArgs()
{
    global $argv;
    array_shift($argv);
    $args = array();
    array_walk($argv, function($v ,$k) use(&$args){
        @list($key, $value) = @explode('=', $v);
        $args[$key] = $value;
    });
    return $args;
}
$args = getClientArgs();
print_r($args);

然后在命令行中执行:显示如下,这样是不是更简洁明了?

[root@123 ~]# php a.php id=4 type=1001 age=25
Array
(
    [id] => 4
    [type] => 1001
    [age] => 25
)

二、error_get_last方法获取的error信息中type种类

    error_get_last是常用在register_shutdown_function注册的脚本执行结束后的处理方法中,从而检查当前页面请求是否发生错误,如发生错误以更友好的形式展现并记录日志。返回的错误数组包含 4 个键名和键值:

[type] - 错误类型
[message] - 错误消息
[file] - 发生错误所在的文件
[line] - 发生错误所在的行

    例如,我修改了控制器文件,让其产生一个语法错误,报错如下:

Array
(
    [type] => 4
    [message] => syntax error, unexpected 'abstract' (T_ABSTRACT)
    [file] => /opt/application/controller/TestController.php
    [line] => 22
)

    不过上面的type=4是什么意思呢?做个记录以方便查询这个错误码的意思:错误值与错误码的对照关系如下:

1	E_ERROR (integer)	#致命的运行时错误。这类错误一般是不可恢复的情况,例如内存分配导致的问题。后果是导致脚本终止不再继续运行。	 
2	E_WARNING (integer)	#运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行。	 
4	E_PARSE (integer)	#编译时语法解析错误。解析错误仅仅由分析器产生。	 
8	E_NOTICE (integer)	#运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知。	 
16	E_CORE_ERROR (integer)	#在PHP初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由PHP引擎核心产生的。	since PHP 4
32	E_CORE_WARNING (integer)	#PHP初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由PHP引擎核心产生的。	since PHP 4
64	E_COMPILE_ERROR (integer)	#致命编译时错误。类似E_ERROR, 但是是由Zend脚本引擎产生的。	since PHP 4
128	E_COMPILE_WARNING (integer)	#编译时警告 (非致命错误)。类似 E_WARNING,但是是由Zend脚本引擎产生的。	since PHP 4
256	E_USER_ERROR (integer)	#用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。	since PHP 4
512	E_USER_WARNING (integer)	#用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。	since PHP 4
1024	E_USER_NOTICE (integer)	#用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。	since PHP 4
2048	E_STRICT (integer)	#启用PHP对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。	since PHP 5
4096	E_RECOVERABLE_ERROR (integer)	#可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。
                        #如果该错误没有被用户自定义句柄捕获 (参见 set_error_handler()),将成为一个 E_ERROR 从而脚本会终止运行。	since PHP 5.2.0
8192	E_DEPRECATED (integer)	#运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。	since PHP 5.3.0
16384	E_USER_DEPRECATED (integer)	#用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。	since PHP 5.3.0
30719	E_ALL (integer)	#E_STRICT出外的所有错误和警告信息。	30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously
  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值