2009-06-15 12 views
5

त्वरित प्रश्न। वहाँPHP सत्य और 'सत्य' अंतर

$success = true; 

और

$success = 'true'; 

के बीच एक अंतर मैं जानता हूँ कि वे एक दूसरे के लिए नहीं '==' कर रहे हैं, लेकिन वहाँ उन्हें प्रयोग में एक फर्क है?

संपादित करें: मैंने पाया कि '===' के बजाय '===' का उपयोग करते हुए यह देखते हुए कि $ सफलता सफलतापूर्वक मेरी समस्या हल हो गई है या नहीं। मेरा सवाल यह है कि, क्या मुझे बस नीचे दिए गए मामले में स्ट्रिंग का उपयोग करना चाहिए, और '==' के साथ चिपकना चाहिए?

$User->ProcessLogin(); 
$loginsuccess = $User->ProcessLogin(); 

if ($loginsuccess == true) {  
    echo "<big>Success<big><br />"; 
     echo "<p>We are now redirecting you to the member area.</p>"; 
     echo "<meta http-equiv='refresh' content='=2;MyAccountNEW.php' />"; 
} 
elseif ($loginsuccess == false) { 
     echo "<span class='sorry'><b>Sorry, your account could not be found.</span></b><div id='shopperlogin'> <img class='shopperlogintext' src='images/shopperlogin.png'> 

    <br /> 

    <form method='post' action='loginNEW.php' name='loginform' id='loginform'> 
    <fieldset> 
     <label for='username'>Username:</label><input type='text' name='username' id='username' /><br /> 
     <label for='password'>Password:</label><input type='password' name='password' id='password' /><br /> 
     <input type='submit' name='login' id='login' value='Login' /> 
    </fieldset> 
    </form></div>"; 
    } 

यहाँ वर्ग का हिस्सा है ..

function ProcessLogin() { 
    if (!empty($_POST['username']) && !empty($_POST['password'])) { 
      $username = mysql_real_escape_string($_POST['username']); 
      $password = md5(mysql_real_escape_string($_POST['password'])); 
      $checklogin = mysql_query("SELECT * FROM users WHERE Username = '".$username."' AND Password = '".$password."'"); 

       if(mysql_num_rows($checklogin) == 1) 
       { 
        $row = mysql_fetch_array($checklogin); 
        $email = $row['EmailAddress']; 

        $_SESSION['Username'] = $username; 
        $_SESSION['EmailAddress'] = $email; 
        $_SESSION['LoggedIn'] = 1; 
        $this->loggedin = true; 
        $success = true; 
       } 
       else { 
        $success = false; 
       } 
       return $success; 
      } 
     } 
+0

आप इसे बहुत आसान बना सकते हैं क्योंकि आप केवल रुचि रखते हैं कि लॉगिनस्टैटस सेट है या नहीं, और इससे कोई फर्क नहीं पड़ता कि यह क्या सेट है। Var $ loginsuccess हमेशा डिफ़ॉल्ट रूप से खाली होगा, जब तक कुछ (जो भी) वापस नहीं किया जाता है। तो ProcessLogin() फ़ंक्शन में, बस "सत्य वापस आएं;" $ सफलता चर का उपयोग करने के बजाय। फिर इसके लिए परीक्षण करें: अगर ($ loginsuccess) {// महान, यह काम किया} और {// विफल}।डुप्लिकेट कोड के साथ विफल होने पर उसी फ़ॉर्म को आउटपुट करने के बजाय, मूल फ़ॉर्म का उपयोग करना भी सबसे अच्छा है। फिर जब कुछ बदलने की जरूरत है, तो आपको केवल मूल/एकल रूप को ठीक करना होगा। – Alec

उत्तर

0

सच है, एक बूलियन है 'सही' एक श्रृंखला है।

4

पहला एक बूलियन है। दूसरा एक स्ट्रिंग

आप इसके साथ अपना अंतर देख सकते हैं।

$success = 'true'; 
$success2 = true; 

var_dump($success); 
var_dump($success2); 

और यह भी इस

var_dump($success == $success2); 
var_dump($success === $success2); 

से परिणाम की जाँच तुम भी this type comparison table. रियल साफ जानकारी का अध्ययन करने और आप थोड़ा और पीएचपी समझने में मदद करता चाहिए।

+0

शायद विपरीत? :) – Svish

+0

हूप्स हाँ, क्षमा करें। फिक्स्ड –

+0

मुझे दृढ़ता से संदेह होगा कि स्ट्रिंग का उपयोग करके == तुलना धीमी है क्योंकि आपको पूरी स्ट्रिंग की तुलना करना है। तो यह भी एक diff के रूप में गिना जाता है। – cgp

13

कोई भी गैर-खाली स्ट्रिंग सत्य पर मूल्यांकन करती है और खाली स्ट्रिंग गलत पर मूल्यांकन करती है। निम्न स्क्रिप्ट आप के लिए कुछ प्रकाश डाला सकता है:

<?php 
if('true' == true) { 
    echo "'true' == true"; 
} else { 
    echo "'true' != true"; 
} 

echo '<br />'; 

if('false' == true) { 
    echo "'false' == true"; 
} else { 
    echo "'false' != true"; 
} 

echo '<br />'; 

if('foo' == true) { 
    echo "'foo' == true"; 
} else { 
    echo "'foo' != true"; 
} 

echo '<br />'; 

if('false' == false) { 
    echo "'false' == false"; 
} else { 
    echo "'false' != false"; 
} 

echo '<br />'; 

if('' == true) { 
    echo "'' == true"; 
} else { 
    echo "'' != true"; 
} 

echo '<br />'; 

if('' == false) { 
    echo "'' == false"; 
} else { 
    echo "'' != false"; 
} 

?> 

यहाँ आउटपुट है:

'true' == true 
'false' == true 
'foo' == true 
'false' != false 
'' != true 
'' == false 

के रूप में अनुरोध किया है, यहाँ कुछ और विभिन्न मूल्यों के लिए === साथ == की तुलना उदाहरण हैं।

<?php 
echo "<b>'true' vs. true</b><br />"; 

if('true' == true) { 
    echo "'true' == true<br />"; 
} else { 
    echo "'true' != true<br />"; 
} 

if('true' === true) { 
    echo "'true' === true<br />"; 
} else { 
    echo "'true' !== true<br />"; 
} 

echo "<br /><b>'false' vs. true</b><br />"; 

if('false' == true) { 
    echo "'false' == true<br />"; 
} else { 
    echo "'false' != true<br />"; 
} 

if('false' === true) { 
    echo "'false' === true<br />"; 
} else { 
    echo "'false' !== true<br />"; 
} 

echo "<br /><b>1 vs. true</b><br />"; 

if(1 == true) { 
    echo "1 == true<br />"; 
} else { 
    echo "1 != true<br />"; 
} 

if(1 === true) { 
    echo "1 === true<br />"; 
} else { 
    echo "1 !== true<br />"; 
} 

echo "<br /><b>0 vs. false</b><br />"; 

if(0 == false) { 
    echo "0 == false<br />"; 
} else { 
    echo "0 != false<br />"; 
} 

if(0 === false) { 
    echo "0 === false<br />"; 
} else { 
    echo "0 !== false<br />"; 
} 

echo "<br /><b>1 vs. 'true'</b><br />"; 

if(1 == 'true') { 
    echo "1 == 'true'<br />"; 
} else { 
    echo "1 != 'true'<br />"; 
} 

if(1 === 'true') { 
    echo "1 === 'true'<br />"; 
} else { 
    echo "1 !== 'true'<br />"; 
} 

echo "<br /><b>empty string '' vs. false</b><br />"; 

if('' == false) { 
    echo "'' == false<br />"; 
} else { 
    echo "'' != false<br />"; 
} 

if('' === true) { 
    echo "'' === false<br />"; 
} else { 
    echo "'' !== false<br />"; 
} 

?> 

आउटपुट:

'सही' बनाम सच

'true' == true 
'true' !== true 

'असत्य' बनाम सच

'false' == true 
'false' !== true 

1 बनाम सच

1 == true 
1 !== true 

0 बनाम झूठी

0 == false 
0 !== false 

1 बनाम'सही'

1 != 'true' 
1 !== 'true' 

रिक्त स्ट्रिंग '' बनाम झूठी

'' == false 
'' !== false 
+1

क्या आप कुछ उदाहरणों में === के साथ अधिक व्यापक प्रदर्शन के लिए जोड़ सकते हैं? –

+0

अनुरोध के रूप में जोड़े गए उदाहरण, मुझे बताएं कि क्या कोई अन्य व्यक्ति है जिसे आप स्पष्ट रूप से देखना चाहते हैं। – defines

1

मैं हमेशा अधिक प्रतिबंधात्मक === या !== जब मैं पूरी तरह से सकारात्मक तो एक बूलियन जवाब की जरूरत है, उपयोग करने का प्रयास:

$success = 'true'; 
if($success === 'false'){ 
... 
} 

बस मामले में।

+0

यह उदाहरण बुलियन झूठी की जांच नहीं कर रहा है, यह 'स्ट्रिंग' वाली स्ट्रिंग के लिए जांच करता है। – defines

0

हां, एक अंतर है। एक PHP चर (या लगभग किसी भी प्रोग्रामिंग भाषा) में प्रत्येक मान एक "प्रकार" है। जब

$foo = 'true'; 

आप जिसका प्रकार एक स्ट्रिंग है एक मूल्य बना रहे हैं तथा बनाते समय/उद्धरण चिह्नों के बिना एक मूल्य बताए उद्धरण के साथ/एक मूल्य बताए, बनाते समय, आप एक चर जिसका प्रकार बूलियन है पैदा कर रहे

$bar = true; 

कुछ अन्य आधुनिक, गतिशील भाषाओं की तरह, PHP चीजों को व्यवस्थित करने में वास्तव में कड़ी मेहनत करता है कि आपको चीजों जैसी चीजों के बारे में चिंता करने की ज़रूरत नहीं है। उदाहरण के लिए, भाषाओं का एक बहुत आप दो चर की समानता की तुलना अगर वे एक ही प्रकार के नहीं हैं, वैसा नहीं होगा, इसलिए कुछ

तरह
if('true' == True) ... 

अजगर में मान्य कोड नहीं है (यदि आप एक मिल जाएगा अपवाद)। दूसरी तरफ, PHP अच्छा होने की कोशिश करता है और (दृश्यों के पीछे) कहता है "ठीक है, यदि आप समानता संचालन में किसी भी स्ट्रिंग का उपयोग करते हैं, तो हम स्ट्रिंग का प्रकार बूलियन और सत्य टाइप करेंगे, जब तक कि यह शून्य-लंबाई न हो स्ट्रिंग "। यही कारण है कि, 90% समय, आप या तो कर सकते हैं।

हालांकि, अंतर हैं। पैडेंटिक से शुरू करने के लिए, जिस कंप्यूटर पर PHP चल रहा है वह एक बूलियन के लिए स्ट्रिंग के लिए अधिक मेमोरी को अलग करने की आवश्यकता है। इस दिन और उम्र में यह एक छोटी राशि है, लेकिन अपशिष्ट नहीं/नहीं चाहते हैं।

अधिक महत्वपूर्ण बात यह है कि ऐसे समय होते हैं जहां PHP के प्रकार का जबरदस्त अजीब चीजें होती हैं जो कोई समझ नहीं लेती हैं। उदाहरण के लिए, के बाद से "सही" पर विचार निम्नलिखित

if ("false" == false) { 
    echo "true\n"; 
} else { 
    echo "false\n"; 
} 

यह बयान "गलत" गूंज होगा, भले ही सहज आप बात यह सच गूंज होगा चाहते == सच के रूप में सही मूल्यांकन करता है। इस तरह के कई किनारे के मामले हैं जहां PHP अजीब तरीके से कार्य करेगा। इसलिए, सामान्य मामला सरल बनाने की कोशिश में (चलो लोगों के लिए चर परिवर्तित करें), उन्होंने कुछ कम आम मामलों को और जटिल बना दिया, जिससे बग को ट्रैक करने में कठिनाई हो सकती है। हालात वास्तव में गड़बड़ हो जाते हैं जब आपकी टीम के कुछ लोग दृश्यों के पीछे पीछे समझते हैं, और अन्य नहीं करते हैं।

तो, बड़े पैमाने पर, सफलतापूर्वक लौटने वाले तरीकों और कार्यों से स्पष्ट बूलियन (कोई उद्धरण) वापस करना हमेशा सर्वोत्तम होता है। अनुभवी प्रोग्रामर उम्मीद करते हैं कि अवांछित प्रोग्रामर इसके बजाए स्ट्रिंग का उपयोग करते समय पॉप-अप की कुछ बग्स से परेशान होंगे।

संबंधित मुद्दे