標籤:callback 註冊 file cal cep options 令行 oca function
<?php/** * 命令列參數解析工具類 * @author guolinchao */class CommandLine{// 臨時記錄短選項的選項值private static $shortOptVal = null;// options valueprivate static $optsArr = array();// command argsprivate static $argsArr = array();// 是否已解析過命令列參數private static $isParse = false;public function __construct() {if(!self::$isParse) {self::parseArgs();}}/** * 擷取選項值 */public function getOptVal($opt) {if(isset(self::$optsArr[$opt])) {return self::$optsArr[$opt];}return null;}/** * 擷取命令列參數 */public function getArg($index) {if(isset(self::$argsArr[$index])) {return self::$argsArr[$index];}return null;}/** * 註冊選項對應的回呼函數, $callback 應該有一個參數, 用於接收選項值 */public function option($opt, $callback) {// checkif(!is_callable($callback)) {throw new Exception(sprintf(‘Not a valid callback function [%s].‘, $callback));}if(isset(self::$optsArr[$opt])) {// call user functioncall_user_func($callback, self::$optsArr[$opt]);} else {throw new Exception(sprintf(‘Unknown option [%s].‘, $opt));}}/** * 是否是 -s 形式的短選項 */public static function isShortOptions($opt) {if(preg_match(‘/^\-([a-zA-Z])$/‘, $opt, $matchs)) {return $matchs[1];}return false;}/** * 是否是 -hlocalhost 形式的短選項 */public static function isShortOptionsWithValue($opt) {if(preg_match(‘/^\-([a-zA-Z])([\S]+)$/‘, $opt, $matchs)) {self::$shortOptVal = $matchs[2];return $matchs[1];}return false;}/** * 是否是 --help 形式的長選項 */public static function isLongOptions($opt) {if(preg_match(‘/^\-\-([a-zA-Z0-9\-_]{2,})$/‘, $opt, $matchs)) {return $matchs[1];}return false;}/** * 是否是 --options=opt_value 形式的長選項 */public static function isLongOptionsWithValue($opt) {if(preg_match(‘/^\-\-([a-zA-Z0-9\-_]{2,})(?:\=(.*?))$/‘, $opt, $matchs)) {$tmpV = trim($matchs[2], ‘"‘);self::$shortOptVal = empty($tmpV) ? true : $tmpV;return $matchs[1];}return false;}/** * 是否是命令列參數 */public static function isArg($value) {return ! preg_match(‘/^\-/‘, $value);}/** * 解析命令列參數 */public static function parseArgs() {global $argv;if(self::$isParse) {return ;}// index start from 1.$index = 1;$length = count($argv);$retArgs = array(‘opts‘=>array(), ‘args‘=>array());while($index < $length) {// current value$curVal = $argv[$index];// short options or long optionsif( ($sp = self::isShortOptions($curVal)) || ($lp = self::isLongOptions($curVal)) ) {// options array key$key = $sp ? $sp : $lp;// go ahead$index++;if( isset($argv[$index]) && self::isArg($argv[$index]) ) {$retArgs[‘opts‘][$key] = $argv[$index];} else {$retArgs[‘opts‘][$key] = true;// back away$index--;}} // short options with value || long options with valueelse if( false !== ($key = self::isShortOptionsWithValue($curVal)) || false !== ($key = self::isLongOptionsWithValue($curVal)) ) {$retArgs[‘opts‘][$key] = self::$shortOptVal;} // command argselse if( self::isArg($curVal) ) {$retArgs[‘args‘][] = $curVal;}// incr index$index++;}self::$optsArr = $retArgs[‘opts‘];self::$argsArr = $retArgs[‘args‘];self::$isParse = true;return $retArgs;}}
用法如下:
<?phpinclude ‘CommandLine.php‘;$args = CommandLine::parseArgs();print_r($args);// or$cmd = new CommandLine();$cmd->option(‘h‘, function ($val){// 處理選項 h // $val 選項值// ...echo ‘Option h handler.‘;});
命令列測試:
PHP 命令列參數解析工具類