Rumah > pembangunan bahagian belakang > tutorial php > PHP 命令行参数解析工具类的示例代码

PHP 命令行参数解析工具类的示例代码

黄舟
Lepaskan: 2023-03-06 16:18:02
asal
1711 orang telah melayarinya

PHP 命令行参数解析工具类的示例代码

<?php
/**
 * 命令行参数解析工具类
 * @author guolinchao
 */
class CommandLine
{
	// 临时记录短选项的选项值
	private static $shortOptVal = null;
	// options value
	private static $optsArr = array();
	// command args
	private 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) {
		// check
		if(!is_callable($callback)) {
			throw new Exception(sprintf(&#39;Not a valid callback function [%s].&#39;, $callback));
		}
		if(isset(self::$optsArr[$opt])) {
			// call user function
			call_user_func($callback, self::$optsArr[$opt]);
		} else {
			throw new Exception(sprintf(&#39;Unknown option [%s].&#39;, $opt));
		}
	}
	
	/**
	 * 是否是 -s 形式的短选项
	 */
	public static function isShortOptions($opt) {
		if(preg_match(&#39;/^\-([a-zA-Z])$/&#39;, $opt, $matchs)) {
			return $matchs[1];
		}
		return false;
	}
	
	/**
	 * 是否是 -hlocalhost 形式的短选项
	 */
	public static function isShortOptionsWithValue($opt) {
		if(preg_match(&#39;/^\-([a-zA-Z])([\S]+)$/&#39;, $opt, $matchs)) {
			self::$shortOptVal = $matchs[2];
			return $matchs[1];
		}
		return false;
	}
	
	/**
	 * 是否是 --help 形式的长选项
	 */
	public static function isLongOptions($opt) {
		if(preg_match(&#39;/^\-\-([a-zA-Z0-9\-_]{2,})$/&#39;, $opt, $matchs)) {
			return $matchs[1];
		}
		return false;
	}
	
	/**
	 * 是否是 --options=opt_value 形式的长选项
	 */
	public static function isLongOptionsWithValue($opt) {
		if(preg_match(&#39;/^\-\-([a-zA-Z0-9\-_]{2,})(?:\=(.*?))$/&#39;, $opt, $matchs)) {
			$tmpV = trim($matchs[2], &#39;"&#39;);
			self::$shortOptVal = empty($tmpV) ? true : $tmpV;
			return $matchs[1];
		}
		return false;
	}
	
	/**
	 * 是否是命令行参数
	 */
	public static function isArg($value) {
		return ! preg_match(&#39;/^\-/&#39;, $value);
	}
	
	/**
	 * 解析命令行参数
	 */
	public static function parseArgs() {
		global $argv;
		
		if(self::$isParse) {
			return ;
		}
		
		// index start from 1.
		$index = 1;
		$length = count($argv);
		$retArgs = array(&#39;opts&#39;=>array(), &#39;args&#39;=>array());
		
		while($index < $length) {
			// current value
			$curVal = $argv[$index];
			// short options or long options
			if( ($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[&#39;opts&#39;][$key] = $argv[$index];
				} else {
					$retArgs[&#39;opts&#39;][$key] = true;
					// back away
					$index--;
				}
			} // short options with value || long options with value
			else if( false !== ($key = self::isShortOptionsWithValue($curVal)) 
				|| false !== ($key = self::isLongOptionsWithValue($curVal)) ) {
				$retArgs[&#39;opts&#39;][$key] = self::$shortOptVal;
			} // command args
			else if( self::isArg($curVal) ) {
				$retArgs[&#39;args&#39;][] = $curVal;
			}
			// incr index
			$index++;
		}
		
		self::$optsArr = $retArgs[&#39;opts&#39;];
		self::$argsArr = $retArgs[&#39;args&#39;];
		self::$isParse = true;
		
		return $retArgs;
	}
}
Salin selepas log masuk

用法如下:

<?php
include &#39;CommandLine.php&#39;;

$args = CommandLine::parseArgs();
print_r($args);

// or
$cmd = new CommandLine();
$cmd->option(&#39;h&#39;, function ($val){
	// 处理选项 h 
	// $val 选项值
	// ...
	echo &#39;Option h handler.&#39;;
});
Salin selepas log masuk

命令行测试:


Atas ialah kandungan terperinci PHP 命令行参数解析工具类的示例代码. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan