2016-11-25 28 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。