2010-07-21 27 views
17

अक्सर PHP में में त्रुटियों पर रोकने के लिए, मैं देख रहा हूँ:') या मर (' का प्रयोग पीएचपी

$result = mysql_query($query) or die(); 

अजगर से आ रहा है, मैं जानता हूँ कि क्यों यह काम करना चाहिए, क्योंकि अगर यह होता है or रिटर्न पहला मान एक बूलियन संदर्भ में सच है, और दूसरा मूल्य अन्यथा (this देखें)।

लेकिन जब मैं की तरह उदाहरण के कुछ करने के लिए एक और संदर्भ में PHP में ऊपर तकनीक की कोशिश,:

$name = "John Doe"; 
echo $name or "Anonymous"; 

or पहले मूल्य ("जॉन डो") वापस नहीं करता है, यह रिटर्न 1.

यह mysql_query() परिणाम केस में क्यों काम करता है, लेकिन अन्य मामलों में नहीं? क्या mysql_query() मामले में उपयोग करना बुरा है (इस तथ्य को अनदेखा करें कि मैं उपयोगकर्ता को उपयोगी त्रुटि नहीं दे रहा हूं)?

उत्तर

33

PHP में, चर असाइनमेंट (बराबर चिह्न) और कार्य दोनों or ऑपरेटर पर प्राथमिकता लेते हैं। इसका मतलब है कि एक फ़ंक्शन पहले निष्पादित हो जाता है, फिर फ़ंक्शन का वापसी मान or तुलना में उपयोग किया जाता है। बदले में जब आप or ऑपरेटर के साथ दो मान/चर का उपयोग करते हैं, तो यह दो मान पहले की तुलना करता है, फिर एक बूलियन मान देता है।

इसलिए, इस उदाहरण में मूल्यांकन के आदेश है:

$result = mysql_query($query) or die(); 
  1. mysql_query($query)
    रिटर्न या तो एक परिणाम के इस तरह के SELECT, या DDL, DML के लिए एक बूलियन मान के रूप में DQL प्रश्नों के लिए निर्धारित या CREATE, DROP, INSERT, UPDATE, DELETE और ALTER जैसे डीसीएल प्रश्न।

  2. $result = mysql_query($query)
    इस क्वेरी निष्पादन का परिणाम चर $result को सौंपा गया है।

  3. $result /* = ... */ or die();
    यदि यह या तो एक परिणाम के सेट या true है, यह माना जाता है सच (उर्फ "truthy") तो or शर्त पूरी होने और बयान यहाँ समाप्त होती है। अन्यथा इसके बजाय स्क्रिप्ट die() होगी।


echo वास्तव में एक मूल्य वापस नहीं करता है एक भाषा निर्माण है और इसलिए है, इसलिए यह एक समारोह की तरह नहीं चलता है इससे पहले कि or तुलना किया जाता है।

$name or "Anonymous" के रूप में हमेशा सच क्योंकि स्ट्रिंग "Anonymous" गैर खाली और इसलिए truthy है, echo परोक्ष 1 को true, इसलिए कि उत्पादन परिवर्तित करता है।

इस उदाहरण में मूल्यांकन के आदेश है:

$name = "John Doe"; 
echo $name or "Anonymous"; 
  1. $name = "John Doe";
    सुंदर सीधा - स्ट्रिंग जॉन डो प्रदान करती है $name करने के लिए।

  2. "John Doe" or "Anonymous"
    के बाद से कम से कम एक स्ट्रिंग गैर है:

  3. $name or "Anonymous"
    पीएचपी पता चलता है कि $name स्ट्रिंग जॉन डो होता है, तो क्या समाप्त होता है मूल्यांकन किया जा रहा है निम्नलिखित यहां खाली, इसे सच्चाई माना जाता है और स्थिति संतुष्ट है। यह मूल्यांकन तब true देता है।

  4. echo true /* $name or... */;
    1 को true में कनवर्ट करता है और प्रिंट संख्या 1.

+2

+1 ग्रेट स्पष्टीकरण। – karim79

+3

+1 महान शब्द, "सच्चाई" –

+0

तो मुझे लगता है कि यह 'printf' जैसे प्रिंट-फ़ंक्शंस के साथ काम करेगा, या यह वही समस्या है, क्योंकि यह आउटपुट उत्पन्न करता है? यह एक समारोह है इसलिए इसे काम करना चाहिए, है ना? –

0

ऐसा इसलिए है क्योंकि echo कोई फ़ंक्शन नहीं है, यह एक भाषा निर्माण है। यह एक समारोह होने के लिए नकल करता है, लेकिन यह वास्तव में नहीं है :)

मैं कभी भी मरने का उपयोग नहीं करता() इस तरह, यह किसी प्रकार का मोटा है। आपको अपनी त्रुटियों को उचित तरीके से संभालना चाहिए, केवल जमानत न करें।

+0

मैंने कहा "इस तथ्य को अनदेखा करें कि मैं उपयोगकर्ता को उपयोगी त्रुटि नहीं लौटा रहा हूं" - यह सवाल का हिस्सा नहीं है।आपने इस उत्तर के साथ पूरी समस्या को याद किया है। इससे कोई फर्क नहीं पड़ता कि मौसम गूंज एक समारोह है या नहीं। 'गूंजें (गलत या सत्य); 'या' printf (झूठी या सत्य); '' a a = (झूठी या सत्य) के समान होना चाहिए; echo $ a; ' – rjmunro

+0

@rjmunro: पहला पैराग्राफ (कोशिश करता है) आपके प्रश्न का उत्तर देता है। '$ $ Echo या "जॉन डो" को क्या करना चाहिए;' क्या करें? '($ नाम गूंजें) या" जॉन डो "' या 'गूंज ($ नाम या" जॉन डो ")'? यह एक महत्वपूर्ण बात है। और इसलिए यह महत्वपूर्ण है कि यह एक कार्य (वापसी मूल्य के साथ) या एक भाषा निर्माण (कोई वापसी मूल्य के साथ) है। –

2

क्यों or लौटना चाहिए कुछ भी? or एक सामान्य बूलियन ऑपरेटर है। $a or $btrue है यदि $a या $btrue और false पर मूल्यांकन करता है।

|| और or के बीच अंतर है, or एक कम ऑपरेटर precedance, = से भी कम है।यही कारण है कि

$result = mysql_query($query) or die(); 

में ही है के रूप में

($result = mysql_query($query)) or (die()); 

जबकि

$result = mysql_query($query) || die(); 

रूप

$result = (mysql_query($query) || die()); 

अपने मामले

में एक ही है 210
echo $name or "Anonymous"; 

हो जाता है

(echo $name) or ("Anonymous"); 

क्या आप शायद के लिए देख रहे त्रिगुट ऑपरेटर है:

echo $name ?: 'Anonymous'; 

ऊपर पीएचपी 5.3 के रूप में आप केवल पीएचपी 5.2 का उपयोग किया है, तो काम करेंगे,:

echo $name ? $name : 'Anonymous'; 
1

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

इस चेक बाहर, वैसे: http://php.net/manual/en/types.comparisons.php

1

or खंड का मूल्यांकन पहले किया जाता है और एक बूलियन लौटाता है जो echo आउटपुट करता है। यदि आप पाठ आउटपुट करना चाहते हैं तो आपको एक/अन्य निर्माण की आवश्यकता है जैसे:

echo ($name ? $name : 'Anonymous'); 
+4

या यदि आप PHP 5.3+ चला रहे हैं, '$ echo echo?: "बेनामी"; ' – nickf

2

प्रश्न पूछने के तुरंत बाद मेरे लिए वास्तव में ऐसा कारण हुआ। यह ऑपरेटर प्राथमिकता के बारे में है। =or से पहले होता है, तो: के रूप में यह अजगर में होगा

$result = (mysql_query($query) or die()); 

:

($result = mysql_query($query)) or die(); 

नहीं:

$result = mysql_query($query) or die(); 

के बराबर है। तो यह:

$a = false or true; 

, झूठी नहीं सच है, जो मुझे भविष्य में कुछ बिंदु पर बाहर पकड़ने के लिए बाध्य है के लिए $a सेट हो जाएगा।

0

यदि आप उस व्यवहार को प्रतिलिपि बनाना चाहते हैं और स्क्रीन/ब्राउज़र पर आउटपुट करना चाहते हैं, तो आपको एक ऐसा फ़ंक्शन चाहिए जो TRUE के अलावा कुछ और लौटाएगा। printf() आपके लिए ऐसा कर सकता है।

echo microtime."&lt;br&gt;";< 
$str = ""; 
printf("%s",$str) or die(); 
echo "&lt;br&gt;".microtime(); 

यदि $ str खाली है, शून्य, या झूठा मर जाता है, अन्यथा, स्क्रिप्ट निष्पादन समाप्त हो जाएगी।

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