flsouto/obj2cli

此包的最新版本(1.0.2)没有可用的许可信息。

从PHP对象创建命令行界面

1.0.2 2016-10-24 00:42 UTC

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程序的有用工具,也可以用于实时测试/调试类。