写在前面
最近写脚本有点多,突发奇想,给脚本增加一个交互式确认的过程
然后了解了一下php
的实现机制
除了通过$_GET
、$_POST
、$_REQUEST
、$_FILE
、$_COOKIE
、$_SERVER
这些全局变量来获取用户输入以外
交互式,就是在命令行也可以获取用户输入
实现效果如下:
实现原理
从php
的标准输入流里获取
也就是php://stdin
获取方式是:fopen("php://stdin", "r")
取这个值的返回,作为读取句柄,建议这个句柄随用随取,取完立即销毁,避免性能开销过大
拿到句柄之后,可以调用fgets($handle)
来获取到用户单次输入的内容,当用户回车之后,这次输入就截止了
函数的返回值就是用户输入的内容。
模板代码
我这里封装成面对对象了
主要可以直接在main
当中嵌入你想要实现的任何方法,很方便
<?php
class MyShell {
private $dbHost = '127.0.0.1';
private $dbUser = 'root';
private $dbPass = 'root';
private $dbName = 'test';
public function __construct()
{
// 读取或修改数据库链接配置
$this->interactiveSetup();
}
public function main()
{
// code...
}
private function interactiveSetup() {
$handle = fopen("php://stdin", "r");
echo "\n=== 数据库配置交互设置 ===\n";
$this->promptAndUpdate('数据库主机', $this->dbHost, $handle);
$this->promptAndUpdate('数据库用户名', $this->dbUser, $handle);
$this->promptAndUpdate('数据库密码', $this->dbPass, $handle);
$this->promptAndUpdate('数据库名', $this->dbName, $handle);
fclose($handle);
// 输出确认信息
echo "\n=== 当前 数据库配置 为 ===\n";
echo "主机: {$this->dbHost}\n";
echo "用户名: {$this->dbUser}\n";
echo "密码: {$this->dbPass}\n";
echo "数据库名: {$this->dbName}\n";
}
private function promptAndUpdate(string $label, string &$property, $handle) {
echo "{$label} [当前: {$property}]: ";
$input = trim(fgets($handle));
if (!empty($input)) {
$property = $input;
}
}
}
$ms = new MyShell();
$ms -> main();