Skip to content

Instantly share code, notes, and snippets.

@Leko
Last active August 29, 2015 14:23
Show Gist options
  • Save Leko/ac86a04d4816940bd71a to your computer and use it in GitHub Desktop.
Save Leko/ac86a04d4816940bd71a to your computer and use it in GitHub Desktop.
古いPHP向けのCLIオプションパーサ
<?php
class CLI {
/**
* CLIオプションを取得する
*
* PHPのgetopt関数はプラットフォーム依存であり、Macで正常動作しなかった。
* 動作環境に依らないオプションのパースをするには時前パースしか無かった。
* PHP5.1にも対応したライブラリがあればそちらを使うほうが懸命。
*
* ## オプションの仕様
* ```sh
* $ php tools/runner.php workflow init -y -dfoo -x'bar1 bar2 bar3' --yes --database=foo --ext='bar1 bar2 bar3'
* array(6) {
* ["y"]=>
* bool(true)
* ["d"]=>
* string(3) "foo"
* ["x"]=>
* string(14) "bar1 bar2 bar3"
* ["yes"]=>
* bool(true)
* ["database"]=>
* string(3) "foo"
* ["ext"]=>
* string(14) "bar1 bar2 bar3"
* }
* ```
*
* まとめ
* - 1文字オプションの場合は空白を空けずに値を記述する。
* - この仕様により、1つのハイフンで複数のオプションを渡すことは出来ない。
* - ロングオプションの場合は=のあとに価を記述する。
* - 価がない場合そのオプションにはtrueを格納する
* - 価に空白が入る場合はクオートする。
*
* @return array
*/
public static function getOptions()
{
global $argv;
$params = array();
foreach($argv as $arg) {
// `-`で始まらないパーツは無視する
if(mb_strpos($arg, '-') !== 0) continue;
if(mb_strpos($arg, '--') === 0) {
$token = mb_substr($arg, 2);
if(mb_strpos($token, '=')) {
list($name, $value) = mb_split('=', $token);
} else {
$name = $token;
$value = true;
}
} else {
$name = mb_substr($arg, 1, 1);
$value = mb_substr($arg, 2);
if($value === '') $value = true;
}
$params[$name] = $value;
}
return $params;
}
}
CLI::getOptions();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment