使用未定义的常量STDIN - 在第5行的C:\ wamp\www\study\sayHello.php中假设为"STDIN"

use*_*343 6 php stdin trim fgets

我想学习php和mySQL,我买了一本书(php&mySql:缺少的手册2edition)

我在win8 64bit机器上安装了Wampserver2.4.

服务器配置

Apache版本:2.4.4
PHP版本:5.4.12

在第一课我得到这个错误:(

Notice: Use of undefined constant STDIN - assumed 'STDIN' in C:\wamp\www\study\sayHello.php on line 5
Run Code Online (Sandbox Code Playgroud)

这是文件"sayHello.php"中的php代码

<?php

echo "Hello there. So I hear you're learning to be a PHP programmer!\n";
echo "Why don't you type in your name for me:\n";
$name = trim(fgets(STDIN));

echo "\nThanks, " . $name . ", it's really nice to meet you.\n\n";

?>
Run Code Online (Sandbox Code Playgroud)

Rik*_*esh 24

只需STDIN在文件顶部定义常量,

define('STDIN',fopen("php://stdin","r"));
Run Code Online (Sandbox Code Playgroud)


Ani*_*war 13

当您尝试使用 PHP 文件运行迁移时

Artisan::call('migrate');
Run Code Online (Sandbox Code Playgroud)

看来那个时候也会产生这些类型的错误。为了解决这个问题,您可以简单地将代码替换为

Artisan::call('migrate', ['--force' => true ]);
Run Code Online (Sandbox Code Playgroud)

如果您在生产中,请确保使用 --force 标志。


jch*_*ook 6

解释

CLI(命令行)SAPI定义I / O常数STDINSTDOUT,和STDERR,纯粹是为了方便起见在该环境中。


解决方案

正如其他答案中所述,您可以简单地在 PHP 代码中定义这些常量。您还可以defined()在通过 CLI 调用时进行检查以避免错误。例如:

<?php

if (!defined('STDIN')) {
  define('STDIN', fopen('php://stdin', 'r'));
}
Run Code Online (Sandbox Code Playgroud)

但是,请记住,php://stdin在非 CLI SAPI(例如 Apache 或 FPM)中,这可能无法按您期望的方式工作。例如,要在通过 FPM 执行时访问原始 POST 正文,您可以php://input改用。


更多信息

PHP 有许多不同的SAPI(服务器应用程序编程接口),允许您在各种环境中执行 PHP 代码,例如 Web 服务器、电子邮件服务器或命令行 (CLI)。例子包括:

  • 电脑动画
  • FPM
  • Milter(电子邮件过滤器)
  • 阿帕奇
  • 等等

每个 SAPI 的初始条件和行为可能略有不同。CLI SAPI 和其他 SAPI 之间的其他一些差异包括:

  • header() 没有效果。
  • 一些 ini 设置,例如html_errorsoutput_buffering具有不同的默认值(更适合 CLI)。
  • 难道改变当前的工作目录(CWD)你执行的脚本。

  • 请注意,当以交互模式运行 PHP(运行“php”)或使用连接到 stdin 的管道(运行“echo Something | php”)时,“STDIN”将不能作为常量使用。可能不会立即显而易见。 (2认同)