0 关注者

类 yii\helpers\BaseConsole

继承关系yii\helpers\BaseConsole
子类yii\helpers\Console
可用版本2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseConsole.php

BaseConsole 为 yii\helpers\Console 提供具体实现。

不要使用 BaseConsole。请改用 yii\helpers\Console

公共方法

隐藏继承方法

方法 描述 定义于
ansiColorizedSubstr() 返回指定起始位置和长度的字符串的 ANSI 颜色代码部分。 yii\helpers\BaseConsole
ansiFormat() 返回使用给定 ANSI 样式格式化的字符串。 yii\helpers\BaseConsole
ansiFormatCode() 返回 ANSI 格式代码。 yii\helpers\BaseConsole
ansiStrlen() 返回不包含 ANSI 颜色代码的字符串长度。 yii\helpers\BaseConsole
ansiStrwidth() 返回不包含 ANSI 颜色代码的字符串宽度。 yii\helpers\BaseConsole
ansiToHtml() 将 ANSI 格式化的字符串转换为 HTML。 yii\helpers\BaseConsole
beginAnsiFormat() 输出一个 ANSI 格式代码,该代码会影响之后打印的任何文本的格式。 yii\helpers\BaseConsole
clearLine() 清除当前光标所在的行,通过向终端发送带参数 2 的 ANSI 控制代码 EL。 yii\helpers\BaseConsole
clearLineAfterCursor() 清除从光标位置到行尾的文本,通过向终端发送带参数 0 的 ANSI 控制代码 EL。 yii\helpers\BaseConsole
clearLineBeforeCursor() 清除从光标位置到行首的文本,通过向终端发送带参数 1 的 ANSI 控制代码 EL。 yii\helpers\BaseConsole
clearScreen() 清除整个屏幕内容,通过向终端发送带参数 2 的 ANSI 控制代码 ED。 yii\helpers\BaseConsole
clearScreenAfterCursor() 清除从光标到屏幕末尾的文本,通过向终端发送带参数 0 的 ANSI 控制代码 ED。 yii\helpers\BaseConsole
clearScreenBeforeCursor() 清除从光标到屏幕开头的文本,通过向终端发送带参数 1 的 ANSI 控制代码 ED。 yii\helpers\BaseConsole
confirm() 提示用户输入 y 或 n 进行确认。 yii\helpers\BaseConsole
endAnsiFormat() 重置之前方法 beginAnsiFormat() 设置的任何 ANSI 格式。 此后的任何输出将使用默认文本格式。 yii\helpers\BaseConsole
endProgress() 结束由 startProgress() 启动的进度条。 yii\helpers\BaseConsole
error() 将文本打印到 STDERR,并附加一个回车符 (PHP_EOL)。 yii\helpers\BaseConsole
errorSummary() 生成验证错误的摘要。 yii\helpers\BaseConsole
escape() 转义 %,这样它们在字符串被 renderColoredString() 解析时不会被解释为颜色代码。 yii\helpers\BaseConsole
getScreenSize() 返回终端屏幕尺寸。 yii\helpers\BaseConsole
hideCursor() 通过向终端发送 ANSI DECTCEM 代码 ?25l 隐藏光标。 yii\helpers\BaseConsole
input() 提示用户输入。 当用户输入回车符 (PHP_EOL) 时结束。 可选地,它还提供一个提示。 yii\helpers\BaseConsole
isRunningOnWindows() 如果控制台在 Windows 上运行,则返回 true。 yii\helpers\BaseConsole
markdownToAnsi() 通过应用一些 ANSI 格式将 Markdown 转换为在控制台环境中更易读的形式。 yii\helpers\BaseConsole
moveCursorBackward() 通过向终端发送 ANSI 控制代码 CUB 将终端光标向后移动。 yii\helpers\BaseConsole
moveCursorDown() 通过向终端发送 ANSI 控制代码 CUD 将终端光标向下移动。 yii\helpers\BaseConsole
moveCursorForward() 通过向终端发送 ANSI 控制代码 CUF 将终端光标向前移动。 yii\helpers\BaseConsole
moveCursorNextLine() 通过向终端发送 ANSI 控制代码 CNL 将终端光标移动到下一行的开头。 yii\helpers\BaseConsole
moveCursorPrevLine() 通过向终端发送 ANSI 控制代码 CPL 将终端光标移动到上一行的开头。 yii\helpers\BaseConsole
moveCursorTo() 通过向终端发送 ANSI 控制代码 CUP 或 CHA 将光标移动到指定的列和行绝对位置。 yii\helpers\BaseConsole
moveCursorUp() 通过向终端发送 ANSI 控制代码 CUU 将终端光标向上移动。 yii\helpers\BaseConsole
output() 将文本打印到 STDOUT,并附加一个回车符 (PHP_EOL)。 yii\helpers\BaseConsole
prompt() 提示用户输入并进行验证。 yii\helpers\BaseConsole
renderColoredString() 通过用 ANSI 控制代码替换诸如 %y(黄色)之类的模式将字符串转换为 ANSI 格式。 yii\helpers\BaseConsole
restoreCursorPosition() 通过向终端发送 ANSI 控制代码 RCP 恢复使用 saveCursorPosition() 保存的光标位置。 yii\helpers\BaseConsole
saveCursorPosition() 通过向终端发送 ANSI 控制代码 SCP 保存当前光标位置。 yii\helpers\BaseConsole
scrollDown() 通过向终端发送 ANSI 控制代码 SD 将整页向下滚动。 yii\helpers\BaseConsole
scrollUp() 通过向终端发送 ANSI 控制代码 SU 将整页向上滚动。 yii\helpers\BaseConsole
select() 让用户从选项中进行选择。 输入 '?' 将显示可供选择的选项及其说明。 yii\helpers\BaseConsole
showCursor() 通过向终端发送 ANSI DECTCEM 代码 ?25h 在使用 hideCursor() 隐藏光标后再次显示光标。 yii\helpers\BaseConsole
startProgress() 开始在屏幕上显示进度条。 yii\helpers\BaseConsole
stderr() 将字符串打印到 STDERR。 yii\helpers\BaseConsole
stdin() 从 STDIN 获取输入并返回一个针对 EOLs 右对齐的字符串。 yii\helpers\BaseConsole
stdout() 将字符串打印到 STDOUT。 yii\helpers\BaseConsole
streamSupportsAnsiColors() 如果流支持颜色化,则返回 true。 如果流不支持,则禁用 ANSI 颜色。 yii\helpers\BaseConsole
stripAnsiFormat() 从字符串中剥离 ANSI 控制代码。 yii\helpers\BaseConsole
updateProgress() 更新由 startProgress() 启动的进度条。 yii\helpers\BaseConsole
wrapText() 使用缩进将文本换行以适应屏幕尺寸。 yii\helpers\BaseConsole
xtermBgColor() 返回 xterm 背景颜色的 ansi 格式代码。 yii\helpers\BaseConsole
xtermFgColor() 返回 xterm 前景色 的 ansi 格式代码。 yii\helpers\BaseConsole

方法详情

隐藏继承方法

ansiColorizedSubstr() public static method

返回指定起始位置和长度的字符串的 ANSI 颜色代码部分。

如果字符串包含颜色代码,则将返回 "TEXT_COLOR + TEXT_STRING + DEFAULT_COLOR",否则将返回简单的 "TEXT_STRING"。

public static string ansiColorizedSubstr ( $string, $start, $length )
$string 字符串
$start 整数
$length 整数

                public static function ansiColorizedSubstr($string, $start, $length)
{
    if ($start < 0 || $length <= 0) {
        return '';
    }
    $textItems = preg_split(self::ansiCodesPattern(), (string)$string);
    preg_match_all(self::ansiCodesPattern(), (string)$string, $colors);
    $colors = count($colors) ? $colors[0] : [];
    array_unshift($colors, '');
    $result = '';
    $curPos = 0;
    $inRange = false;
    foreach ($textItems as $k => $textItem) {
        $color = $colors[$k];
        if ($curPos <= $start && $start < $curPos + Console::ansiStrwidth($textItem)) {
            $text = mb_substr($textItem, $start - $curPos, null, Yii::$app->charset);
            $inRange = true;
        } else {
            $text = $textItem;
        }
        if ($inRange) {
            $result .= $color . $text;
            $diff = $length - Console::ansiStrwidth($result);
            if ($diff <= 0) {
                if ($diff < 0) {
                    $result = mb_substr($result, 0, $diff, Yii::$app->charset);
                }
                $defaultColor = static::renderColoredString('%n');
                if ($color && $color != $defaultColor) {
                    $result .= $defaultColor;
                }
                break;
            }
        }
        $curPos += mb_strlen($textItem, Yii::$app->charset);
    }
    return $result;
}

            
ansiFormat() 公共静态方法

返回使用给定 ANSI 样式格式化的字符串。

public static string ansiFormat ( $string, $format = [] )
$string 字符串

要格式化的字符串

$format array

包含格式化值的数组。可以传递任何 FG_*BG_*TEXT_* 常量,以及 xtermFgColor()xtermBgColor() 来指定格式。

                public static function ansiFormat($string, $format = [])
{
    $code = implode(';', $format);
    return "\033[0m" . ($code !== '' ? "\033[" . $code . 'm' : '') . $string . "\033[0m";
}

            
ansiFormatCode() 公共静态方法

返回 ANSI 格式代码。

public static string ansiFormatCode ( $format )
$format array

包含格式化值的数组。可以传递任何 FG_*BG_*TEXT_* 常量,以及 xtermFgColor()xtermBgColor() 来指定格式。

return 字符串

根据给定的格式化常量返回 ANSI 格式代码。

                public static function ansiFormatCode($format)
{
    return "\033[" . implode(';', $format) . 'm';
}

            
ansiStrlen() 公共静态方法

返回不包含 ANSI 颜色代码的字符串长度。

public static integer ansiStrlen ( $string )
$string 字符串

要测量的字符串

return 整数

字符串的长度,不包括 ANSI 格式字符

                public static function ansiStrlen($string)
{
    return mb_strlen(static::stripAnsiFormat($string));
}

            
ansiStrwidth() 公共静态方法 (自版本 2.0.36 起可用)

返回不包含 ANSI 颜色代码的字符串宽度。

public static integer ansiStrwidth ( $string )
$string 字符串

要测量的字符串

return 整数

字符串的宽度,不包括 ANSI 格式字符

                public static function ansiStrwidth($string)
{
    return mb_strwidth(static::stripAnsiFormat($string), Yii::$app->charset);
}

            
ansiToHtml() 公共静态方法

将 ANSI 格式化的字符串转换为 HTML。

注意:目前不支持 xTerm 256 位颜色。

public static string ansiToHtml ( $string, $styleMap = [] )
$string 字符串

要转换的字符串。

$styleMap array

ANSI 控制代码的可选映射,例如 FG_COLORBOLD,映射到一组 css 样式定义。CSS 样式定义表示为一个数组,其中数组键对应于 css 样式属性名称,而值是 css 值。值可以是将被合并并使用 ' ' 作为分隔符进行拼接的数组。

return 字符串

ANSI 格式化字符串的 HTML 表示形式

                public static function ansiToHtml($string, $styleMap = [])
{
    $styleMap = [
        // https://www.w3.org/TR/CSS2/syndata.html#value-def-color
        self::FG_BLACK => ['color' => 'black'],
        self::FG_BLUE => ['color' => 'blue'],
        self::FG_CYAN => ['color' => 'aqua'],
        self::FG_GREEN => ['color' => 'lime'],
        self::FG_GREY => ['color' => 'silver'],
        // https://meyerweb.com/eric/thoughts/2014/06/19/rebeccapurple/
        // https://drafts.csswg.org/css-color/#valuedef-rebeccapurple
        self::FG_PURPLE => ['color' => 'rebeccapurple'],
        self::FG_RED => ['color' => 'red'],
        self::FG_YELLOW => ['color' => 'yellow'],
        self::BG_BLACK => ['background-color' => 'black'],
        self::BG_BLUE => ['background-color' => 'blue'],
        self::BG_CYAN => ['background-color' => 'aqua'],
        self::BG_GREEN => ['background-color' => 'lime'],
        self::BG_GREY => ['background-color' => 'silver'],
        self::BG_PURPLE => ['background-color' => 'rebeccapurple'],
        self::BG_RED => ['background-color' => 'red'],
        self::BG_YELLOW => ['background-color' => 'yellow'],
        self::BOLD => ['font-weight' => 'bold'],
        self::ITALIC => ['font-style' => 'italic'],
        self::UNDERLINE => ['text-decoration' => ['underline']],
        self::OVERLINED => ['text-decoration' => ['overline']],
        self::CROSSED_OUT => ['text-decoration' => ['line-through']],
        self::BLINK => ['text-decoration' => ['blink']],
        self::CONCEALED => ['visibility' => 'hidden'],
    ] + $styleMap;
    $tags = 0;
    $result = preg_replace_callback(
        '/\033\[([\d;]+)m/',
        function ($ansi) use (&$tags, $styleMap) {
            $style = [];
            $reset = false;
            $negative = false;
            foreach (explode(';', $ansi[1]) as $controlCode) {
                if ($controlCode == 0) {
                    $style = [];
                    $reset = true;
                } elseif ($controlCode == self::NEGATIVE) {
                    $negative = true;
                } elseif (isset($styleMap[$controlCode])) {
                    $style[] = $styleMap[$controlCode];
                }
            }
            $return = '';
            while ($reset && $tags > 0) {
                $return .= '</span>';
                $tags--;
            }
            if (empty($style)) {
                return $return;
            }
            $currentStyle = [];
            foreach ($style as $content) {
                $currentStyle = ArrayHelper::merge($currentStyle, $content);
            }
            // if negative is set, invert background and foreground
            if ($negative) {
                if (isset($currentStyle['color'])) {
                    $fgColor = $currentStyle['color'];
                    unset($currentStyle['color']);
                }
                if (isset($currentStyle['background-color'])) {
                    $bgColor = $currentStyle['background-color'];
                    unset($currentStyle['background-color']);
                }
                if (isset($fgColor)) {
                    $currentStyle['background-color'] = $fgColor;
                }
                if (isset($bgColor)) {
                    $currentStyle['color'] = $bgColor;
                }
            }
            $styleString = '';
            foreach ($currentStyle as $name => $value) {
                if (is_array($value)) {
                    $value = implode(' ', $value);
                }
                $styleString .= "$name: $value;";
            }
            $tags++;
            return "$return<span style=\"$styleString\">";
        },
        $string
    );
    while ($tags > 0) {
        $result .= '</span>';
        $tags--;
    }
    return $result;
}

            
beginAnsiFormat() 公共静态方法

输出一个 ANSI 格式代码,该代码会影响之后打印的任何文本的格式。

另请参阅

public static void beginAnsiFormat ( $format )
$format array

包含格式化值的数组。可以传递任何 FG_*BG_*TEXT_* 常量,以及 xtermFgColor()xtermBgColor() 来指定格式。

                public static function beginAnsiFormat($format)
{
    echo "\033[" . implode(';', $format) . 'm';
}

            
clearLine() 公共静态方法

清除当前光标所在的行,通过向终端发送带参数 2 的 ANSI 控制代码 EL。

光标位置不会改变。

public static void clearLine ( )

                public static function clearLine()
{
    echo "\033[2K";
}

            
clearLineAfterCursor() 公共静态方法

清除从光标位置到行尾的文本,通过向终端发送带参数 0 的 ANSI 控制代码 EL。

光标位置不会改变。

public static void clearLineAfterCursor ( )

                public static function clearLineAfterCursor()
{
    echo "\033[0K";
}

            
clearLineBeforeCursor() 公共静态方法

清除从光标位置到行首的文本,通过向终端发送带参数 1 的 ANSI 控制代码 EL。

光标位置不会改变。

public static void clearLineBeforeCursor ( )

                public static function clearLineBeforeCursor()
{
    echo "\033[1K";
}

            
clearScreen() 公共静态方法

清除整个屏幕内容,通过向终端发送带参数 2 的 ANSI 控制代码 ED。

光标位置不会改变。注意:Windows 中使用的 ANSI.SYS 实现会将光标位置重置为屏幕的左上角。

public static void clearScreen ( )

                public static function clearScreen()
{
    echo "\033[2J";
}

            
clearScreenAfterCursor() 公共静态方法

清除从光标到屏幕末尾的文本,通过向终端发送带参数 0 的 ANSI 控制代码 ED。

光标位置不会改变。

public static void clearScreenAfterCursor ( )

                public static function clearScreenAfterCursor()
{
    echo "\033[0J";
}

            
clearScreenBeforeCursor() 公共静态方法

清除从光标到屏幕开头的文本,通过向终端发送带参数 1 的 ANSI 控制代码 ED。

光标位置不会改变。

public static void clearScreenBeforeCursor ( )

                public static function clearScreenBeforeCursor()
{
    echo "\033[1J";
}

            
confirm() 公共静态方法

提示用户输入 y 或 n 进行确认。

一个典型的用法如下

if (Console::confirm("Are you sure?")) {
    echo "user typed yes\n";
} else {
    echo "user typed no\n";
}
public static boolean confirm ( $message, $default false )
$message 字符串

在等待用户输入之前打印输出

$default boolean

如果没有进行选择,则返回此值。

return boolean

用户是否确认

                public static function confirm($message, $default = false)
{
    while (true) {
        static::stdout($message . ' (yes|no) [' . ($default ? 'yes' : 'no') . ']:');
        $input = trim(static::stdin());
        if (empty($input)) {
            return $default;
        }
        if (!strcasecmp($input, 'y') || !strcasecmp($input, 'yes')) {
            return true;
        }
        if (!strcasecmp($input, 'n') || !strcasecmp($input, 'no')) {
            return false;
        }
    }
}

            
endAnsiFormat() 公共静态方法

重置之前方法 beginAnsiFormat() 设置的任何 ANSI 格式。 此后的任何输出将使用默认文本格式。

这等同于调用。

echo Console::ansiFormatCode([Console::RESET])
public static void endAnsiFormat ( )

                public static function endAnsiFormat()
{
    echo "\033[0m";
}

            
endProgress() 公共静态方法

结束由 startProgress() 启动的进度条。

另请参阅

public static void endProgress ( $remove false, $keepPrefix true )
$remove 字符串|布尔值

这可以是 `false`,将进度条留在屏幕上,只打印一个换行符。如果设置为 `true`,进度条的行将被清除。这也可以是一个字符串,用于显示而不是进度条。

$keepPrefix boolean

是否在进度条被移除时保留为进度条指定的前缀。默认为 true。

                public static function endProgress($remove = false, $keepPrefix = true)
{
    if ($remove === false) {
        static::stdout(PHP_EOL);
    } else {
        if (static::streamSupportsAnsiColors(STDOUT)) {
            static::clearLine();
        }
        static::stdout("\r" . ($keepPrefix ? self::$_progressPrefix : '') . (is_string($remove) ? $remove : ''));
    }
    flush();
    self::$_progressStart = null;
    self::$_progressWidth = null;
    self::$_progressPrefix = '';
    self::$_progressEta = null;
    self::$_progressEtaLastDone = 0;
    self::$_progressEtaLastUpdate = null;
}

            
error() 公共静态方法

将文本打印到 STDERR,并附加一个回车符 (PHP_EOL)。

public static 整数|布尔值 error ( $string null )
$string 字符串|空值

要打印的文本

return 整数|布尔值

打印的字节数或错误时的 false。

                public static function error($string = null)
{
    return static::stderr($string . PHP_EOL);
}

            
errorSummary() 公共静态方法 (自版本 2.0.14 起可用)

生成验证错误的摘要。

public static 字符串 errorSummary ( $models, $options = [] )
$models yii\base\Model|yii\base\Model[]

要显示其验证错误的模型。

$options array

标记选项,以名称-值对的形式。以下选项将被特殊处理

  • showAllErrors: 布尔值,如果设置为 true,则将显示每个属性的每个错误消息,否则仅显示每个属性的第一个错误消息。默认为 `false`。
return 字符串

生成的错误摘要

                public static function errorSummary($models, $options = [])
{
    $showAllErrors = ArrayHelper::remove($options, 'showAllErrors', false);
    $lines = self::collectErrors($models, $showAllErrors);
    return implode(PHP_EOL, $lines);
}

            
escape() 公共静态方法

转义 %,这样它们在字符串被 renderColoredString() 解析时不会被解释为颜色代码。

public static 字符串 escape ( $string )
$string 字符串

要转义的字符串

                public static function escape($string)
{
    // TODO rework/refactor according to https://github.com/yiisoft/yii2/issues/746
    return str_replace('%', '%%', $string);
}

            
getScreenSize() 公共静态方法

返回终端屏幕尺寸。

用法

list($width, $height) = ConsoleHelper::getScreenSize();
public static 数组|布尔值 getScreenSize ( $refresh false )
$refresh boolean

是否强制检查而不重用缓存的大小值。这对在应用程序运行时检测窗口大小的变化很有用,但在每个终端上可能无法获得最新的值。

return 数组|布尔值

一个包含 ($width, $height) 的数组或无法确定大小时的 false。

                public static function getScreenSize($refresh = false)
{
    static $size;
    static $execDisabled;
    if ($size !== null && ($execDisabled || !$refresh)) {
        return $size;
    }
    if ($execDisabled === null) {
        $execDisabled = !function_exists('ini_get') || preg_match('/(\bexec\b)/i', ini_get('disable_functions'));
        if ($execDisabled) {
            return $size = false;
        }
    }
    if (static::isRunningOnWindows()) {
        $output = [];
        exec('mode con', $output);
        if (isset($output[1]) && strpos($output[1], 'CON') !== false) {
            return $size = [(int) preg_replace('~\D~', '', $output[4]), (int) preg_replace('~\D~', '', $output[3])];
        }
    } else {
        // try stty if available
        $stty = [];
        if (exec('stty -a 2>&1', $stty)) {
            $stty = implode(' ', $stty);
            // Linux stty output
            if (preg_match('/rows\s+(\d+);\s*columns\s+(\d+);/mi', $stty, $matches)) {
                return $size = [(int) $matches[2], (int) $matches[1]];
            }
            // MacOS stty output
            if (preg_match('/(\d+)\s+rows;\s*(\d+)\s+columns;/mi', $stty, $matches)) {
                return $size = [(int) $matches[2], (int) $matches[1]];
            }
        }
        // fallback to tput, which may not be updated on terminal resize
        if (($width = (int) exec('tput cols 2>&1')) > 0 && ($height = (int) exec('tput lines 2>&1')) > 0) {
            return $size = [$width, $height];
        }
        // fallback to ENV variables, which may not be updated on terminal resize
        if (($width = (int) getenv('COLUMNS')) > 0 && ($height = (int) getenv('LINES')) > 0) {
            return $size = [$width, $height];
        }
    }
    return $size = false;
}

            
hideCursor() 公共静态方法

通过向终端发送 ANSI DECTCEM 代码 ?25l 隐藏光标。

使用 showCursor() 将其恢复。不要忘记在应用程序退出时显示光标。光标可能在退出后隐藏在终端中。

public static void hideCursor ( )

                public static function hideCursor()
{
    echo "\033[?25l";
}

            
input() 公共静态方法

提示用户输入。 当用户输入回车符 (PHP_EOL) 时结束。 可选地,它还提供一个提示。

public static 字符串 input ( $prompt null )
$prompt 字符串|空值

在等待输入之前显示的提示(可选)

return 字符串

用户的输入

                public static function input($prompt = null)
{
    if (isset($prompt)) {
        static::stdout($prompt);
    }
    return static::stdin();
}

            
isRunningOnWindows() 公共静态方法

如果控制台在 Windows 上运行,则返回 true。

public static 布尔值 isRunningOnWindows ( )

                public static function isRunningOnWindows()
{
    return DIRECTORY_SEPARATOR === '\\';
}

            
markdownToAnsi() 公共静态方法

通过应用一些 ANSI 格式将 Markdown 转换为在控制台环境中更易读的形式。

public static 字符串 markdownToAnsi ( $markdown )
$markdown 字符串

Markdown 字符串。

return 字符串

解析后的结果,以 ANSI 格式字符串形式。

                public static function markdownToAnsi($markdown)
{
    $parser = new ConsoleMarkdown();
    return $parser->parse($markdown);
}

            
moveCursorBackward() 公共静态方法

通过向终端发送 ANSI 控制代码 CUB 将终端光标向后移动。

如果光标已经在屏幕边缘,则此操作无效。

public static void moveCursorBackward ( $steps 1 )
$steps 整数

光标应向后移动的步数

                public static function moveCursorBackward($steps = 1)
{
    echo "\033[" . (int) $steps . 'D';
}

            
moveCursorDown() 公共静态方法

通过向终端发送 ANSI 控制代码 CUD 将终端光标向下移动。

如果光标已经在屏幕边缘,则此操作无效。

public static void moveCursorDown ( $rows 1 )
$rows 整数

光标应向下移动的行数

                public static function moveCursorDown($rows = 1)
{
    echo "\033[" . (int) $rows . 'B';
}

            
moveCursorForward() 公共静态方法

通过向终端发送 ANSI 控制代码 CUF 将终端光标向前移动。

如果光标已经在屏幕边缘,则此操作无效。

public static void moveCursorForward ( $steps 1 )
$steps 整数

光标应向前移动的步数

                public static function moveCursorForward($steps = 1)
{
    echo "\033[" . (int) $steps . 'C';
}

            
moveCursorNextLine() 公共静态方法

通过向终端发送 ANSI 控制代码 CNL 将终端光标移动到下一行的开头。

public static void moveCursorNextLine ( $lines 1 )
$lines 整数

光标向下移动的行数

                public static function moveCursorNextLine($lines = 1)
{
    echo "\033[" . (int) $lines . 'E';
}

            
moveCursorPrevLine() 公共静态方法

通过向终端发送 ANSI 控制代码 CPL 将终端光标移动到上一行的开头。

public static void moveCursorPrevLine ( $lines 1 )
$lines 整数

光标向上移动的行数

                public static function moveCursorPrevLine($lines = 1)
{
    echo "\033[" . (int) $lines . 'F';
}

            
moveCursorTo() 公共静态方法

通过向终端发送 ANSI 控制代码 CUP 或 CHA 将光标移动到指定的列和行绝对位置。

public static void moveCursorTo ( $column, $row null )
$column 整数

基于1的列号,1 是屏幕的最左侧。

$row integer|null

基于1的行号,1 是屏幕的顶端。如果未设置,则仅在当前行移动光标。

                public static function moveCursorTo($column, $row = null)
{
    if ($row === null) {
        echo "\033[" . (int) $column . 'G';
    } else {
        echo "\033[" . (int) $row . ';' . (int) $column . 'H';
    }
}

            
moveCursorUp() 公共静态方法

通过向终端发送 ANSI 控制代码 CUU 将终端光标向上移动。

如果光标已经在屏幕边缘,则此操作无效。

public static void moveCursorUp ( $rows 1 )
$rows 整数

光标向上移动的行数

                public static function moveCursorUp($rows = 1)
{
    echo "\033[" . (int) $rows . 'A';
}

            
output() 公共静态方法

将文本打印到 STDOUT,并附加一个回车符 (PHP_EOL)。

public static integer|boolean output ( $string null )
$string 字符串|空值

要打印的文本

return 整数|布尔值

打印的字节数或错误时的 false。

                public static function output($string = null)
{
    return static::stdout($string . PHP_EOL);
}

            
prompt() 公共静态方法

提示用户输入并进行验证。

public static string prompt ( $text, $options = [] )
$text 字符串

提示字符串

$options array

用于验证输入的选项

  • required: 是否为必需项
  • default: 如果用户没有输入,则为默认值
  • pattern: 用于验证用户输入的正则表达式模式
  • validator: 用于验证输入的可调用函数。该函数必须接受两个参数
  • input: 要验证的用户输入
  • error: 如果验证失败,则按引用传递的错误值。
return 字符串

用户输入

                public static function prompt($text, $options = [])
{
    $options = ArrayHelper::merge(
        [
            'required' => false,
            'default' => null,
            'pattern' => null,
            'validator' => null,
            'error' => 'Invalid input.',
        ],
        $options
    );
    $error = null;
    top:
    $input = $options['default']
        ? static::input("$text [" . $options['default'] . '] ')
        : static::input("$text ");
    if ($input === '') {
        if (isset($options['default'])) {
            $input = $options['default'];
        } elseif ($options['required']) {
            static::output($options['error']);
            goto top;
        }
    } elseif ($options['pattern'] && !preg_match($options['pattern'], $input)) {
        static::output($options['error']);
        goto top;
    } elseif ($options['validator'] && !call_user_func_array($options['validator'], [$input, &$error])) {
        static::output(isset($error) ? $error : $options['error']);
        goto top;
    }
    return $input;
}

            
renderColoredString() 公共静态方法

通过用 ANSI 控制代码替换诸如 %y(黄色)之类的模式将字符串转换为 ANSI 格式。

使用与 https://github.com/pear/Console_Color2/blob/master/Console/Color2.php 几乎相同的语法。转换表为: ('bold' 在某些终端上表示 'light')。它与 irssi 使用的转换表几乎相同。

             text      text            background
 ------------------------------------------------
 %k %K %0    black     dark grey       black
 %r %R %1    red       bold red        red
 %g %G %2    green     bold green      green
 %y %Y %3    yellow    bold yellow     yellow
 %b %B %4    blue      bold blue       blue
 %m %M %5    magenta   bold magenta    magenta
 %p %P       magenta (think: purple)
 %c %C %6    cyan      bold cyan       cyan
 %w %W %7    white     bold white      white

 %F     Blinking, Flashing
 %U     Underline
 %8     Reverse
 %_,%9  Bold

 %n     Resets the color
 %%     A single %

第一个参数是要转换的字符串,第二个参数是可选标志,指示是否应使用颜色。默认值为 true,如果设置为 false,则颜色代码将被删除 (并且 %% 将被转换为 %)

public static string renderColoredString ( $string, $colored true )
$string 字符串

要转换的字符串

$colored boolean

字符串是否应该有颜色?

                public static function renderColoredString($string, $colored = true)
{
    // TODO rework/refactor according to https://github.com/yiisoft/yii2/issues/746
    static $conversions = [
        '%y' => [self::FG_YELLOW],
        '%g' => [self::FG_GREEN],
        '%b' => [self::FG_BLUE],
        '%r' => [self::FG_RED],
        '%p' => [self::FG_PURPLE],
        '%m' => [self::FG_PURPLE],
        '%c' => [self::FG_CYAN],
        '%w' => [self::FG_GREY],
        '%k' => [self::FG_BLACK],
        '%n' => [0], // reset
        '%Y' => [self::FG_YELLOW, self::BOLD],
        '%G' => [self::FG_GREEN, self::BOLD],
        '%B' => [self::FG_BLUE, self::BOLD],
        '%R' => [self::FG_RED, self::BOLD],
        '%P' => [self::FG_PURPLE, self::BOLD],
        '%M' => [self::FG_PURPLE, self::BOLD],
        '%C' => [self::FG_CYAN, self::BOLD],
        '%W' => [self::FG_GREY, self::BOLD],
        '%K' => [self::FG_BLACK, self::BOLD],
        '%N' => [0, self::BOLD],
        '%3' => [self::BG_YELLOW],
        '%2' => [self::BG_GREEN],
        '%4' => [self::BG_BLUE],
        '%1' => [self::BG_RED],
        '%5' => [self::BG_PURPLE],
        '%6' => [self::BG_CYAN],
        '%7' => [self::BG_GREY],
        '%0' => [self::BG_BLACK],
        '%F' => [self::BLINK],
        '%U' => [self::UNDERLINE],
        '%8' => [self::NEGATIVE],
        '%9' => [self::BOLD],
        '%_' => [self::BOLD],
    ];
    if ($colored) {
        $string = str_replace('%%', '% ', $string);
        foreach ($conversions as $key => $value) {
            $string = str_replace(
                $key,
                static::ansiFormatCode($value),
                $string
            );
        }
        $string = str_replace('% ', '%', $string);
    } else {
        $string = preg_replace('/%((%)|.)/', '$2', $string);
    }
    return $string;
}

            
restoreCursorPosition() 公共静态方法

通过向终端发送 ANSI 控制代码 RCP 恢复使用 saveCursorPosition() 保存的光标位置。

public static void restoreCursorPosition ( )

                public static function restoreCursorPosition()
{
    echo "\033[u";
}

            
saveCursorPosition() 公共静态方法

通过向终端发送 ANSI 控制代码 SCP 保存当前光标位置。

然后可以使用 restoreCursorPosition() 恢复位置。

public static void saveCursorPosition ( )

                public static function saveCursorPosition()
{
    echo "\033[s";
}

            
scrollDown() 公共静态方法

通过向终端发送 ANSI 控制代码 SD 将整页向下滚动。

新的行将添加到顶部。windows 中使用的 ANSI.SYS 不支持此功能。

public static void scrollDown ( $lines 1 )
$lines 整数

要向下滚动的行数

                public static function scrollDown($lines = 1)
{
    echo "\033[" . (int) $lines . 'T';
}

            
scrollUp() 公共静态方法

通过向终端发送 ANSI 控制代码 SU 将整页向上滚动。

新的行将添加到底部。windows 中使用的 ANSI.SYS 不支持此功能。

public static void scrollUp ( $lines 1 )
$lines 整数

要向上滚动的行数

                public static function scrollUp($lines = 1)
{
    echo "\033[" . (int) $lines . 'S';
}

            
select() 公共静态方法

让用户从选项中进行选择。 输入 '?' 将显示可供选择的选项及其说明。

public static string select ( $prompt, $options = [], $default null )
$prompt 字符串

提示信息

$options array

要从中选择的选项的键值对数组。键是输入和使用的内容,值是通过 help 命令显示给最终用户的。

$default 字符串|空值

用户不提供选项时要使用的值。如果默认值为 null,则用户必须选择一个选项。

return 字符串

用户选择的选项字符

版本 描述
2.0.49 添加了 $default 参数

                public static function select($prompt, $options = [], $default = null)
{
    top:
    static::stdout("$prompt (" . implode(',', array_keys($options)) . ',?)'
        . ($default !== null ? '[' . $default . ']' : '') . ': ');
    $input = static::stdin();
    if ($input === '?') {
        foreach ($options as $key => $value) {
            static::output(" $key - $value");
        }
        static::output(' ? - Show help');
        goto top;
    } elseif ($default !== null && $input === '') {
        return $default;
    } elseif (!array_key_exists($input, $options)) {
        goto top;
    }
    return $input;
}

            
showCursor() 公共静态方法

通过向终端发送 ANSI DECTCEM 代码 ?25h 在使用 hideCursor() 隐藏光标后再次显示光标。

public static void showCursor ( )

                public static function showCursor()
{
    echo "\033[?25h";
}

            
startProgress() 公共静态方法

开始在屏幕上显示进度条。

此进度条将由 updateProgress() 更新,并可能由 endProgress() 结束。

以下示例展示了进度条的简单用法

Console::startProgress(0, 1000);
for ($n = 1; $n <= 1000; $n++) {
    usleep(1000);
    Console::updateProgress($n, 1000);
}
Console::endProgress();

类似 Git clone 的进度(仅显示状态信息)

Console::startProgress(0, 1000, 'Counting objects: ', false);
for ($n = 1; $n <= 1000; $n++) {
    usleep(1000);
    Console::updateProgress($n, 1000);
}
Console::endProgress("done." . PHP_EOL);

另请参阅

public static void startProgress ( $done, $total, $prefix '', $width null )
$done 整数

已完成的项目数量。

$total 整数

要完成的项目总数。

$prefix 字符串

一个可选的字符串,显示在进度条之前。默认为空字符串,这意味着不显示前缀。

$width integer|float|boolean|null

进度条的可选宽度。这可以是一个整数,表示进度条显示的字符数,也可以是一个介于 0 和 1 之间的浮点数,表示进度条占屏幕的百分比。也可以设置为 false 以禁用进度条,只显示百分比、项目数和 ETA 等进度信息。如果没有设置,进度条将与屏幕一样宽。屏幕大小将使用 getScreenSize() 检测。

                public static function startProgress($done, $total, $prefix = '', $width = null)
{
    self::$_progressStart = time();
    self::$_progressWidth = $width;
    self::$_progressPrefix = $prefix;
    self::$_progressEta = null;
    self::$_progressEtaLastDone = 0;
    self::$_progressEtaLastUpdate = time();
    static::updateProgress($done, $total);
}

            
stderr() 公共静态方法

将字符串打印到 STDERR。

public static integer|boolean stderr ( $string )
$string 字符串

要打印的字符串

return 整数|布尔值

打印的字节数,或错误时为 false

                public static function stderr($string)
{
    return fwrite(\STDERR, $string);
}

            
stdin() 公共静态方法

从 STDIN 获取输入并返回一个针对 EOLs 右对齐的字符串。

public static string stdin ( $raw false )
$raw boolean

如果设置为 true,则返回未修剪的原始字符串

return 字符串

从 stdin 读取的字符串

                public static function stdin($raw = false)
{
    return $raw ? fgets(\STDIN) : rtrim(fgets(\STDIN), PHP_EOL);
}

            
stdout() 公共静态方法

将字符串打印到 STDOUT。

public static integer|boolean stdout ( $string )
$string 字符串

要打印的字符串

return 整数|布尔值

打印的字节数,或错误时为 false

                public static function stdout($string)
{
    return fwrite(\STDOUT, $string);
}

            
streamSupportsAnsiColors() 公共静态方法

如果流支持颜色化,则返回 true。 如果流不支持,则禁用 ANSI 颜色。

  • 没有 ansicon 的 Windows
  • 非 tty 控制台
public static boolean streamSupportsAnsiColors ( $stream )
$stream 混合
return boolean

如果流支持 ANSI 颜色,则为 true,否则为 false。

                public static function streamSupportsAnsiColors($stream)
{
    return DIRECTORY_SEPARATOR === '\\'
        ? getenv('ANSICON') !== false || getenv('ConEmuANSI') === 'ON'
        : function_exists('posix_isatty') && @posix_isatty($stream);
}

            
stripAnsiFormat() 公共静态方法

从字符串中剥离 ANSI 控制代码。

public static string stripAnsiFormat ( $string )
$string 字符串

要剥离的字符串

                public static function stripAnsiFormat($string)
{
    return preg_replace(self::ansiCodesPattern(), '', (string)$string);
}

            
updateProgress() 公共静态方法

更新由 startProgress() 启动的进度条。

另请参阅

public static void updateProgress ( $done, $total, $prefix null )
$done 整数

已完成的项目数量。

$total 整数

要完成的项目总数。

$prefix 字符串|空值

一个可选的字符串,显示在进度条之前。默认为 null,这意味着将使用 startProgress() 指定的前缀。如果指定了前缀,它将更新后续调用中将使用的前缀。

                public static function updateProgress($done, $total, $prefix = null)
{
    if ($prefix === null) {
        $prefix = self::$_progressPrefix;
    } else {
        self::$_progressPrefix = $prefix;
    }
    $width = static::getProgressbarWidth($prefix);
    $percent = ($total == 0) ? 1 : $done / $total;
    $info = sprintf('%d%% (%d/%d)', $percent * 100, $done, $total);
    self::setETA($done, $total);
    $info .= self::$_progressEta === null ? ' ETA: n/a' : sprintf(' ETA: %d sec.', self::$_progressEta);
    // Number extra characters outputted. These are opening [, closing ], and space before info
    // Since Windows uses \r\n\ for line endings, there's one more in the case
    $extraChars = static::isRunningOnWindows() ? 4 : 3;
    $width -= $extraChars + static::ansiStrlen($info);
    // skipping progress bar on very small display or if forced to skip
    if ($width < 5) {
        static::stdout("\r$prefix$info   ");
    } else {
        if ($percent < 0) {
            $percent = 0;
        } elseif ($percent > 1) {
            $percent = 1;
        }
        $bar = floor($percent * $width);
        $status = str_repeat('=', $bar);
        if ($bar < $width) {
            $status .= '>';
            $status .= str_repeat(' ', $width - $bar - 1);
        }
        static::stdout("\r$prefix" . "[$status] $info");
    }
    flush();
}

            
wrapText() 公共静态方法 (自版本 2.0.4 起可用)

使用缩进将文本换行以适应屏幕尺寸。

如果无法检测到屏幕大小,或者缩进量大于屏幕大小,则文本将不会换行。

第一行将**不会**缩进,因此,Console::wrapText("Lorem ipsum dolor sit amet.", 4) 将产生以下输出,假设屏幕宽度为 16 个字符

Lorem ipsum
    dolor sit
    amet.
public static string wrapText ( $text, $indent 0, $refresh false )
$text 字符串

要换行的文本

$indent 整数

用于缩进的空格数。

$refresh boolean

是否强制刷新屏幕大小。这将传递给 getScreenSize()

return 字符串

换行后的文本。

                public static function wrapText($text, $indent = 0, $refresh = false)
{
    $size = static::getScreenSize($refresh);
    if ($size === false || $size[0] <= $indent) {
        return $text;
    }
    $pad = str_repeat(' ', $indent);
    $lines = explode("\n", wordwrap($text, $size[0] - $indent, "\n"));
    $first = true;
    foreach ($lines as $i => $line) {
        if ($first) {
            $first = false;
            continue;
        }
        $lines[$i] = $pad . $line;
    }
    return implode("\n", $lines);
}

            
xtermBgColor() 公共静态方法

返回 xterm 背景颜色的 ansi 格式代码。

您可以将此方法的返回值传递给格式化方法之一:ansiFormat()ansiFormatCode()beginAnsiFormat()

另请参阅 https://en.wikipedia.org/wiki/Talk:ANSI_escape_code#xterm-256colors

public static string xtermBgColor ( $colorCode )
$colorCode 整数

Xterm 颜色代码

                public static function xtermBgColor($colorCode)
{
    return '48;5;' . $colorCode;
}

            
xtermFgColor() 公共静态方法

返回 xterm 前景色 的 ansi 格式代码。

您可以将此方法的返回值传递给格式化方法之一:ansiFormat()ansiFormatCode()beginAnsiFormat()

另请参阅 https://en.wikipedia.org/wiki/Talk:ANSI_escape_code#xterm-256colors

public static string xtermFgColor ( $colorCode )
$colorCode 整数

Xterm 颜色代码

                public static function xtermFgColor($colorCode)
{
    return '38;5;' . $colorCode;
}