2

这让我有点生气,以为可能是服务器配置问题,但我已经在不同的主机上尝试过,也遇到了同样的问题。

我已经缩小范围并创建了一个测试脚本来排除一切

<?php
$myFile = "test.txt";
$fh = fopen($myFile, 'r') || die("Couln't open file");
if ( $fh == true ) {
        echo "file handle valid<br>";
}
else {
        echo "file handle invalid<br>";
}
$theData = fread($fh, filesize($myFile)) || die("Couldn't read file");
echo $theData;
fclose($fh)|| die("Couldn't close file");
?>

当 test.txt 丢失时,我正确地得到了 die 无法打开文件当 test.txt 在那里时,我得到了

警告:fread():提供的参数不是有效的流资源

我已将 test.txt 设置为 777 以确保

我也写了这个只是为了仔细检查,效果很好

<?php
$data = file_get_contents('test.txt');
echo $data;
?>

希望有人可以为我阐明这一点。

4

2 回答 2

2

您被PHP 中的运算符优先级所困扰。||具有比 更高的优先级=,因此您实际上是将逻辑 OR 的结果分配给$fh. 切换到

$fh = fopen($myFile, 'r') or die("Couln't open file");
                          ^^--- lower precedence logical or

会解决问题。

使用or,将 的返回值fopen()分配给$fh,然后or die()评估 ——如果 fopen() 返回文件句柄,则 or 将失败并且代码继续。如果 fopen 失败,则返回布尔值 false 并且 or die 开始。

使用||时,fopen 的值与 die 调用进行逻辑或运算,并且该或 (false) 的结果将分配给 $fh。

于 2012-06-05T14:16:34.157 回答
1
$fh = fopen($myFile, 'r') || die("Couln't open file");

您正在为 分配一个布尔表达式$fh,在此过程中丢失了实际的文件句柄。尝试将上面的行更改为

($fh = fopen($myFile, 'r')) || die("Couln't open file");
于 2012-06-05T14:10:50.680 回答