php中getopt的缺陷及修复
在这里,我不得不再一次感叹php语言库函数的山寨与不专业。getopt函数就是一个典型的例子,通常用的时候,大家可能觉得没有什么,但在某些情况 下,就真的让人很囧。一个简单的函数,稍微多花几分钟就弄得更好一些了,但这个语言有个随意的开端,就有个随意的实现啊。
在linux中,使用getopt时候,有两种情况:
1.取得的参数解析成字符串:“php test_arg.php -c abc”,这种情况c参数取得的结果就是abc这个字符串
2.取得的参数解析成数组:“php test_arg.php -c abc -c abc123”,这种情况c参数取得的结果就是包含abc与abc123的数组
但是遇到这种情况呢:“php test_arg.php -c abc*”?由于linux的shell已经帮程序做了输入参数的解析,这时候c参数得到的既不是abc*这个结果也不是一个数组,而是被shell展开成了很多文件名后的第一个。
可能getopt用的童鞋很少,但这种山寨的设计,实在太让人憋屈了,自己花个10分钟写一个就比它的要好,为了避免大家重复劳动,分享一个代码片段
function mygetopt(){
global $argv;
$result = array();
$current_key = false;
foreach($argv as $opt){
$matches = array();
if(1 === preg_match("/^-{1,2}(.*)$/", $opt, $matches)){
$current_key = $matches[1];
if(false === isset($result[$current_key])){
$result[$current_key] = false;
}
}else if (false !== $current_key){
if(false === $result[$current_key]){
$result[$current_key] = $opt;
}else{
if(false === is_array($result[$current_key])){
$result[$current_key] = array($result[$current_key]);
}
$result[$current_key][] = $opt;
}
}
}
return $result;
}
为了方便使用,将新版本的getopt函数设置为不接受任何参数,但是解析的结果可以输出所有的参数内容。因为php官方的getopt函数使用后,也无非是对输出的数组进行foreach之后进行switch,还不如方便点,直接解析所有呢。除了这一点,这个getopt函数的输出结果与php官方的完全一致
php官方getopt函数参考文档:http://cn.php.net/manual/en/function.getopt.php
---------------------------------------------------------------
本站作品根据创作共同协议进行授权, 转载时请务必以超链接形式标明文章原始出处
原文地址:http://www.mirecle.com/2010/05/17/php-and-repair-defects-in-the-getopt.html
---------------------------------------------------------------
您可能会喜欢:
最近實作了一個 GetOpt Parser ,希望對你也有幫助
請看
http://c9s.blogspot.com/2011/11/php-getoptionkit.html