print $text; $useStdin = $stdin !== null; if (! $useStdin && ! self::isTty()) { return $default; } $hint = $default ? '[yes]' : '[no]'; $stream = $useStdin ? $stdin : (defined('STDIN') ? STDIN : null); if ($stream === null) { return $default; } while (true) { $writer("{$question} (yes/no) {$hint}: "); $raw = fgets($stream); if ($raw === false) { return $default; } $parsed = self::parse($raw, $default); if ($parsed !== null) { return $parsed; } $writer(" yes, y, no, n 중 하나로 입력해 주세요.\n"); } } /** * 입력 문자열을 yes/no/null 로 정규화한다. * * @param string $raw 사용자 입력 원문 (개행 포함 가능) * @param bool $default empty 입력 시 반환할 값 * @return bool|null true=yes, false=no, null=재질문 필요 */ public static function parse(string $raw, bool $default): ?bool { $answer = strtolower(trim($raw)); if ($answer === '') { return $default; } if ($answer === 'yes' || $answer === 'y') { return true; } if ($answer === 'no' || $answer === 'n') { return false; } return null; } /** * STDIN 이 TTY 인지 검사한다. */ private static function isTty(): bool { if (! defined('STDIN')) { return false; } if (function_exists('stream_isatty')) { return @stream_isatty(STDIN); } if (function_exists('posix_isatty')) { return @posix_isatty(STDIN); } return false; } }