PHP

2011-05-09 20 views
11

में असाइनमेंट का मूल्यांकन मेरे पास php के बारे में 'मूलभूत' प्रश्न है।PHP

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

कैसे यह बयान ($buffer = fgets($handle, 4096)) एक मूल्य हो सकता है है: fgets के लिए उदाहरण कोड में, यह एक फ़ाइल की सामग्री के माध्यम से पढ़ने का एक उदाहरण के रूप में इस स्निपेट है? क्या यह $buffer का असाइनमेंट + मूल्यांकन है? मेरा मतलब है, यह इसका मूल्य कैसे प्राप्त करता है? क्या इसके लिए कोई नाम है? मैंने सख्त तुलना का उपयोग करके नोटिस किया है, तो क्या सभी असाइनमेंट एक बुलियन को सही या गलत मानते हैं?

अगर मैं ऐसा काम लिखना चाहता हूं जिसे इस तरह से इलाज किया जा सकता है, तो क्या मुझे कुछ शर्तों पर झूठी वापसी के अलावा कुछ भी विशेष करना है?

उत्तर

15

PHP में एक असाइनमेंट एक अभिव्यक्ति है, यानी यह एक मूल्य देता है। $buffer = fgets($handle, 4096) पहले मान को $buffer पर असाइन करेगा और फिर असाइन किए गए मान को वापस कर देगा।

तो, मूल रूप से, आप लिख सकते हैं:

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

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

यहाँ आप एक अलग लाइन पर काम करना होगा। क्योंकि उस स्थिति में आपको असाइनमेंट को डुप्लिकेट करने की आवश्यकता है, लूप स्थिति में असाइनमेंट को प्राथमिकता दी जाती है।

पुनश्च: थोड़ी देर के पाश में एक काम के लिए सबसे आम उदाहरण शायद mysql से पंक्तियों को लाते समय है: (। जैसे while या if)

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

मुझे यह करने के लिए मारो;, इसलिए उदाहरण के कोड स्निपेट में) – rockerest

+0

कारण यह काम करता है क्योंकि 'fgets'' झूठा 'वापस कर सकता है, जो' झूठी 'को' $ बफर 'के मान के रूप में निर्दिष्ट करेगा, जो बदले में असाइनमेंट का मूल्यांकन करने का परिणाम होगा? – user151841

+1

@ user151841: हाँ, यही कारण है;) – NikiC

1

एक शर्त के संदर्भ में, (x = y) दोनों एक काम है और एक अभिव्यक्ति। यह वह मान देता है जो असाइन किया जा रहा है।

आपको अपने कार्यों के लिए कुछ भी करने की आवश्यकता नहीं है ताकि उन्हें इस तरह इस्तेमाल किया जा सके - यह भाषा की एक विशेषता है।

1

यह बताता है कि fgetsfalse वापस नहीं लौटा रहा है। ब्रैकेट में असाइनमेंट मान देता है जो असाइन किया गया है। तो ($buffer = fgets($handle, 4096))fgets मूल्य लौटा रहा है।

यदि फ़ाइल सूचक में पढ़ने के लिए कोई और डेटा नहीं है, तो FALSE वापस आ गया है।

सरल उदाहरण:

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

रिटर्न

b 
3

क्योंकि गलत या तो "कोई और अधिक डेटा" या के लिए दिया जाता है "त्रुटि," while पाश बस जब तक यह बंद हो जाने चाहिए निष्पादित करेंगे ।

एक लेखन के और अधिक स्पष्ट तरीका है कि होगा:

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

लेकिन उस के रूप में स्वच्छ के पास कहीं भी नहीं है।

2

जब आप PHP में असाइनमेंट करते हैं, तो असाइनमेंट असाइन किए गए मान को वापस देता है। यह आपको सशर्त या लूप या अन्य अभिव्यक्तियों में असाइनमेंट का मूल्यांकन करने की अनुमति देता है।

var_dump ($var = 'test'); 

परिणाम "परीक्षण" प्रदर्शित किया जाएगा।

उपरोक्त कोड उदाहरण एक असाइनमेंट और एक ही ऑपरेशन में एक परीक्षण करता है, एक प्रकार का प्रोग्रामर का शॉर्टेंड जो काफी आम है। fgets() एक खुली फ़ाइल से एक लाइन देता है, या झूठी अगर वापस करने के लिए कोई लाइन नहीं है। आप

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

कर सकता है, लेकिन आप निश्चित रूप से (पाश से पहले एक fgets करके पाश में प्रवेश, या उस से प्रदर्शित नहीं हो जाएगी लेकिन isn एक मूल्य असाइन करने से पहले एक गैर झूठी मूल्य के लिए बफर सेट करना होगा एक खाली स्ट्रिंग जैसे झूठी नहीं है)।

0

=== ऑपरेटर न केवल चेक के एक समारोह के कुछ है कि झूठी (जैसे 0, शून्य, आदि) के रूप में देखा जा सकता है वापस लौट आता है के रूप में आप यहां पढ़ सकते हैं यह वास्तव में बूलियन false से उनकी जांच: http://de.php.net/manual/en/language.operators.comparison.php

1

प्रति प्रलेखन, और दूसरों ने पहले ही क्या कहा है, यह वापस बूलियन वापसी नहीं करता है। जब यह हो जाता है या कोई त्रुटि होती है तो यह केवल बूलियन लौटाता है।

पीएचपी मैनुअल से: - 1 बाइट्स फ़ाइल से पढ़ने संभाल द्वारा की ओर इशारा किया

की लंबाई के लिए एक स्ट्रिंग देता है।

यदि कोई त्रुटि होती है, तो FALSE लौटाता है।

तो, वैसे भी, वहाँ कैसे काम करता है इस तरह की एक विधि के बारे में कुछ खास नहीं है आप अपने खुद के विधि इस तरह से लिख सकता है,:

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

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