写在前面

最近写脚本有点多,突发奇想,给脚本增加一个交互式确认的过程

然后了解了一下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();
最后修改:2025 年 07 月 10 日
如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~