PHP में “कुछ या कैसे (DIE)” काम करता है?


99

मैं एक MySQL डेटाबेस तक पहुँचने के लिए एक php ऐप लिख रहा हूँ, और एक ट्यूटोरियल पर, यह फॉर्म का कुछ कहता है

mysql_connect($host, $user, $pass) or die("could not connect");

PHP को कैसे पता चलता है कि फ़ंक्शन विफल हो गया है ताकि वह मरने वाला भाग चला सके? मुझे लगता है कि मैं पूछ रहा हूं कि इसका "या" हिस्सा कैसे काम करता है। मुझे नहीं लगता कि मैंने इसे पहले देखा है।


3
एक तरफ के रूप में, वास्तविक अनुप्रयोगों में इस तरह के तर्क का उपयोग न करें। यह अभी भी मुझे आश्चर्यचकित करता है कि कितने ट्यूटोरियल करते हैं।
एरान गैपरिन

2
इसका उपयोग क्यों नहीं करते? यह वास्तव में अच्छा और पठनीय है ...
rjj

11
एक ट्यूटोरियल के लिए सरल और उपयुक्त हो सकता है, लेकिन आप नहीं चाहते हैं कि आपकी स्क्रिप्ट वास्तविक उपयोगकर्ताओं के सामने एक त्रुटि संदेश के साथ अपमानजनक तरीके से मर जाए। कस्टम त्रुटि पृष्ठ दिखाना (वास्तविक त्रुटि को निर्दिष्ट किए बिना!) + त्रुटि लॉग करना एक आवश्यक है।
एरान गैल्परिन

4
मैं "या" के बारे में बात कर रहा हूं, "मर" नहीं।
आर्टिलियस

21
mysql_connect ($ होस्ट, $ उपयोगकर्ता, $ पास) या PrintNiceError ('DatabsaeConnectionError');
मैटपी

जवाबों:


133

यदि पहला बयान वापस आता है true, तो पूरा बयान होना चाहिए trueइसलिए दूसरे भाग को कभी भी निष्पादित नहीं किया जाता है।

उदाहरण के लिए:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

इसलिए, यदि आपकी क्वेरी असफल है, तो यह die()कथन का मूल्यांकन करेगा और स्क्रिप्ट को समाप्त करेगा।


1
अच्छे खर्च। यह "निहित है अगर" PHP का भाषा निर्माण थोड़ा खतरनाक है, क्योंकि आपके पास ऐसे कथन हो सकते हैं जो आपको लगता है कि निष्पादित हो जाते हैं लेकिन वास्तव में नहीं होते हैं, और यह स्पष्ट नहीं है जैसे कि अगर आपके पास एक ब्लॉक था।
पेट्रोज़ा

6
इसे शॉर्ट-सर्किट मूल्यांकन कहा जाता है और यह PHP के अलावा अन्य भाषाओं में भी उपयोगी है।
श्री ग्रिवर

1
वैसे, आप OR के बाद केवल एक स्टेटमेंट का उपयोग कर सकते हैं। एक ब्लॉक स्टेटमेंट सिंटैक्स चेकिंग में विफल हो जाएगा (उदाहरण के लिए वास्तविक त्रुटि संदेश पार्स त्रुटि हो सकती है: सिंटैक्स त्रुटि, अप्रत्याशित '{' इन ...)
स्कॉट चू

और यहाँ मैं सोच रहा था कि यह किसी प्रकार की उन्नत विशेषता है जैसे कि अजगर का withकथन, जब यह वास्तव में सिर्फ एक बूलियन अभिव्यक्ति है ... मुझे लगता है कि इस अभिव्यक्ति का उपयोग करते समय अतिरिक्त देखभाल की जानी चाहिए यदि आपसे मामले में सफाई की उम्मीद की जाती है त्रुटियों। कृपया, मुझे गलत होने पर सही करें, लेकिन यदि आप करते हैं func_call($file) or die();और फ़ंक्शन विफल हो जाता है, तो स्क्रिप्ट के मरने पर फ़ाइल को खुला छोड़ दिया जाता है।
11

@Petruza क्या यह orउन परिस्थितियों में उपयोग करने के लिए अच्छा अभ्यास है जहां कोई ifकाम कर सकता है?
सीमांककूट

32

PHP का orकाम C की तरह है ||(जो संयोगवश PHP द्वारा भी समर्थित है - orबस अच्छे लग रहा है और अलग-अलग ऑपरेटर पूर्वता है - इस पृष्ठ को देखें )।

इसे शॉर्ट-सर्किट ऑपरेटर के रूप में जाना जाता है क्योंकि यह अंतिम मूल्य तय करने के लिए पर्याप्त जानकारी होने के बाद किसी भी मूल्यांकन को छोड़ देगा।

आपके उदाहरण में, यदि mysql_connect()TRUE लौटाता है, तो PHP पहले से ही जानती है कि पूरा विवरण TRUE का मूल्यांकन करेगा die(), चाहे जो भी हो, और इसलिए die()उसका मूल्यांकन नहीं किया जाता है।

यदि mysql_connect()FALSE लौटाता है, तो PHP को यह नहीं पता होता है कि पूरा विवरण TRUE या FALSE का मूल्यांकन करेगा या नहीं, इसलिए यह आगे बढ़ता है और die()प्रक्रिया में स्क्रिप्ट को समाप्त करने का प्रयास करता है ।

यह सिर्फ एक अच्छी ट्रिक है जो orकाम करने के तरीके का फायदा उठाती है ।


लघु चक्कर लगाने के लिए +1। "साइड इफेक्ट" का नाम भी दिया हो सकता है। हम मरने () रिटर्न कोड में बिल्कुल भी रुचि नहीं रखते हैं, हम सिर्फ इसके निष्पादन का प्रभाव चाहते हैं। (यह हमेशा मरने वाला नहीं है) ()। यह हमेशा शुद्धतावादियों के साथ लोकप्रिय नहीं है क्योंकि कुछ प्रभाव अस्पष्ट हो सकते हैं।
mckenzm

और यह सब नहीं है। आप सामान का उपयोग और संयोजन भी कर सकते हैं, जहाँ आप चाहते हैं कि एक चीज़ दूसरी चीज़ करने से पहले निश्चित रूप से काम करे।
मेरा 1

11

यह काम करता है जैसा कि दूसरों ने वर्णन किया है।

PHP में, "डाई" का उपयोग न करें, क्योंकि यह अपवाद नहीं बढ़ाता (जैसा कि पर्ल में होता है)। इसके बजाय सामान्य तरीके से एक अपवाद को ठीक से फेंक दें।

मरो को PHP में नहीं पकड़ा जा सकता है, और लॉग नहीं करता है - इसके बजाय यह संदेश को अनजाने में प्रिंट करता है और तुरंत स्क्रिप्ट को किसी को कुछ भी बताए बिना या आपको घटना को रिकॉर्ड करने, रिट्री आदि करने का कोई मौका देने के लिए छोड़ देता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.