2016-11-25 69 views
1

PHP的fopen应该PHP的fopen返回TRUE

成功返回文件指针资源,或错误FALSE。

$f = fopen ($logfile, "a"); 

file_put_contents("/tmp/foo", gettype($f)."--".print_r ($f), TRUE); 

fopen在Apache日志,这正是我希望在这个特殊的情况下,但是自带后的错误处理逻辑是行不通的,因为if ($f)成功打印failed to open stream: Permission denied

/tmp/foo的痕迹告诉我们

boolean--1 

我想我可以用is_resource做出错误处理的工作,但是这看起来像一个bug在PHP,不是吗?还是有其他可能导致这种情况的东西?

+1

'或错误。 '。所以类型将始终为布尔值。当上下文是函数时,Php返回值是布尔值 –

回答

1

我认为print_r的轻微滥用正在引起混淆。请注意,如果您希望使用print_r“inline”,则需要第二个参数。

echo print_r($f, 1).' '.TRUE; 

那将打印:

1 

它打印一个空间的原因,然后1是$ f为FALSE,它在打印的print_r什么。但是,如果您要求字符串直接打印TRUE,则会将其转换为整数表示,即“1”。

试试这个:

if ($f) { 
    echo 'f!'; 
} else { 
    echo 'no f'; 
} 

你会发现,有 “无F” 如果FOPEN失败。尝试使用此测试:

if ($f !== false) { 

这样您就可以确定它是一种资源。

0

你在什么系统上?它的工作原理如下预期:

<?php 
$f = fopen('/var/log/mail.err', "a"); 
var_dump($f); 
if ($f === false) { 
    echo 'Not a valid stream'; 
} 

输出:

<br /> 
<b>Warning</b>: fopen(/var/log/mail.err): failed to open stream: Permission denied in <b>/foobar.php</b> on line <b>2</b><br /> 
bool(false) 
Not a valid stream 

测试Debian的。 PHP7.0。