2011-05-09 95 views
11

我有一種關於php的「基礎」問題。在fgets示例代碼,它有這個片段是通過文件的內容讀取一個例子:php中的賦值評估

while (($buffer = fgets($handle, 4096)) !== false) { 
    echo $buffer; 
} 

它是如何陳述($buffer = fgets($handle, 4096))可以有一個價值?這是一種作業+評估$buffer?我的意思是,它是如何得到它的價值的?有沒有這個名字?我注意到它使用嚴格的比較,所以所有的賦值評估布爾真或假?

如果我想編寫一個可以這種方式處理的函數,除了在特定條件下返回false之外,是否必須執行任何特殊的操作?

回答

15

在PHP中,賦值是一個表達式,即它返回一個值。 $buffer = fgets($handle, 4096)將首先將值分配給$buffer,然後返回分配的值。

所以,基本上,你可以寫:

$buffer = fgets($handle, 4096); 
while ($buffer !== false) { 
    echo $buffer; 

    $buffer = fgets($handle, 4096); 
} 

在這裏,您將有一個單獨的行分配。因爲在這種情況下,您需要複製作業,因此在循環條件下的作業是首選。

PS:用於在while循環的分配最常見的例子可能是從MySQL讀取行:(例如whileif

while ($row = mysql_fetch_assoc($result)) { 
    echo $row['firstname'] . ' ' . $row['lastname']; 
} 
+0

打我給它;所以在示例代碼片段) – rockerest 2011-05-09 18:01:56

+0

,它工作的原因是因爲'fgets'可能會返回'false',這會將'false'賦值爲'$ buffer'的值,而這又會是評估賦值的結果? – user151841 2011-05-09 18:04:27

+1

@ user151841:是的,正是這個原因;) – NikiC 2011-05-09 18:05:25

1

在病症的上下文中,(x = y)既是分配和一個表達。它返回正在分配的值。

你不需要對你的函數做任何特殊的操作就可以像這樣使用它 - 這是該語言的一個特性。

1

它會在fgets未返回的情況下執行false。括號中的分配返回已分配的值。所以($buffer = fgets($handle, 4096))正在返回fgets的值。

如果在文件指針中沒有更多數據要讀取,則返回FALSE。

簡單的例子:

$a = 'a'; 
$b = 'b'; 
echo ($a = $b); 

返回

b 
3

由於返回FALSE的不是 「沒有更多的數據」 或 「錯誤」 的while循環只會執行,直到它必須停止。

採用書面形式的更清晰的方式,這將是:

$buffer = fgets($handle, 4096); 
while($buffer !== false) 
{ 
    echo $buffer; 
    $buffer = fgets($handle, 4096); 
} 

但這遠不及清潔。

2

當您在PHP中進行賦值時,賦值將返回分配的值。這允許您評估條件或循環或其他表達式中的賦值。

var_dump ($var = 'test'); 

結果將會顯示「測試」。

上面的代碼示例在同一個操作中做了一個賦值和一個測試,這種程序員的速記很常見。 fgets()從打開的文件返回一行,如果沒有行返回,則返回false。你可以做

while ($buffer !== false) { 
    echo $buffer; 
    $buffer = fgets($handle, 4096); 
} 

但當然,你必須進入循環(由循環之前做一個與fgets,或分配,將無法顯示,但ISN值之前設置緩衝到非假值假如空字符串)。

1

每文檔以及其他人已經說過的內容,它不會返回布爾值。它只在完成或返回錯誤時才返回布爾值。

從PHP手冊:

返回的最大長度的字符串 - 從文件中讀取1個 字節由 把手指向。

如果發生錯誤,則返回FALSE。

所以,無論如何,沒有什麼特別的地方像這樣的方法是如何工作的,你可以寫你自己的方法是這樣的:

function increment($num) { 
    if($num < 10) { return ++$num; } 
    return false; 
} 

$i=-1; 
while(($i = increment($i)) !== false) { 
    echo($i."<br />"); 
}