flsouto / obj2cli
从PHP对象创建命令行界面
This package is not auto-updated.
Last update: 2024-09-18 20:05:21 UTC
README
概览
这个库允许您从一个普通的PHP对象创建一个交互式shell应用程序。命令被路由到实例方法,命令参数作为方法参数传递。
安装
您可以将obj2cli.php文件简单地下载到项目的文件夹中,或者通过composer安装它
composer require flsouto/obj2cli
注意:在这两种情况下,您都需要手动包含文件,因为它将不会被自动加载!
用法
假设我们想创建一个有两个可用命令的应用程序
- say_hello - 打印 "hello" 到stdout
- say - 接受一个参数并打印它
这是使用obj2cli实现它的方法
<?php // my_app.php
require_once('obj2cli.php');
class MyApp{
function say_hello(){
echo "Hello!";
}
function say($what){
echo $what;
}
}
obj2cli(new MyApp());
就是这样!将其保存为my_app.php并通过命令行运行它
$ php my_app.php
将启动一个新的会话,其名称为您的应用程序的名称(默认情况下是您的对象类名)
MyApp>
现在让我们试试看它是否按预期工作
MyApp> say_hello
hello
MyApp> say Cool!
Cool!
注意:命令参数由空格分隔。
可选参数
如果您为参数提供一个默认值,它将按预期工作
<?php
require_once('obj2cli.php');
class MyApp{
function generate_file_name($name, $ext='txt'){
echo $name.'.'.$ext;
}
}
obj2cli(new MyApp());
$ php my_app.php
MyApp> generate_file_name cache
cache.txt
MyApp> generate_file_name cache json
cache.json
MyApp> ^C
特殊命令
帮助
如果您的类中没有定义帮助命令,它将列出所有可用的方法/命令
MyApp> help
- say_hello (no parameters)
- say <what>
- generate_file_name <name> [ext = txt]
command --help
显示特定命令的用法
MyApp> generate_file_name --help
generate_file_name <name> [ext = txt]
退出
退出应用程序。
注意:这与按CTRL+C不同。退出命令返回到父上下文(见下文),而CTRL+C退出整个应用程序。
创建子上下文
如果一个命令返回另一个对象,控制权将传递给该对象。请看一个示例
<?php
require_once('obj2cli.php');
class MyApp{
function multiply($number){
return new Multiply($number);
}
}
class Multiply{
var $number;
function __construct($number){
$this->number = $number;
}
function by($number2){
echo $this->number * $number2;
}
}
obj2cli(new MyApp());
$ php my_app.php
MyApp> multiply 3
Multiply> by 5
15
Multiply> by 6
18
Multiply> by 7
21
Multiply> exit
MyApp>
注意“退出”命令如何结束“乘法”上下文并将其带回到“MyApp”父上下文。按CTRL+C会关闭两个上下文。
上下文名称
虽然上面的示例工作得很好,但最好能自定义“乘法”上下文的名称,使其看起来像“乘法 3...>”。默认情况下,使用对象的类名作为上下文名称,但可以通过实现一个名为getObj2cliName的方法来更改它
// ...
class Multiply{
var $number;
function __construct($number){
$this->number = $number;
}
// Customize name of context
function getObj2cliName(){
return "Multiply $this->number....";
}
function by($number2){
echo $this->number * $number2;
}
}
//...
从命令行运行任何类
此存储库附带一个名为“run.php”的脚本,允许您将任何类实例化为交互式shell程序
$ php run.php /path/to/file.php MyClass arg1 arg2
MyClass>
如果要在composer的自动加载器中自动加载您要处理的类,您应该提供vendor/autoload.php的路径
$ php run.php /path/to/vendor/autoload.php SomeClass arg1 arg2
SomeClass>
最后思考
这是一个用于快速构建交互式shell程序的有用工具,也可以用于实时测试/调试类。