2009-07-22 12 views
9

काम नहीं कर रहा है क्या किसी को पता है कि मेरी requ_once() या die() क्यों है? काम नहीं कर रहा। यह हमेशा त्रुटि संदेश के बजाय घातक त्रुटि दिखाता है जिसे मैं मर() में कुंजी करता हूं। मेरे कोड के लिए नीचे देखें:requ_once() या die()

require_once ('abc.php') or die("oops"); 

त्रुटि संदेश नीचे

"Fatal error: controller::require_once() [function.require]: Failed opening required '1' (include_path='....."

संदेश के बजाय

("oops") में मैं कुंजी के रूप में प्रदर्शन

उत्तर

28

या एक उच्च है। आवश्यकता/requ_once की तुलना में प्राथमिकता। इसलिए php

('abc.php') or die("oops") 

का मूल्यांकन करता है require_once के लिए परिणाम पार करने से पहले। या दो बूलियन ऑपरेंड लेता है। सच लिए ('abc.php') का मूल्यांकन करता है इसलिए पूरे अभिव्यक्ति सच और

require_once true; 

शुरू हो जाती है है। require_once एक स्ट्रिंग लेता है, बूल (सत्य) - > स्ट्रिंग = > 1 = >

Failed opening required ' 1'
आपको वहां या मरने की आवश्यकता नहीं है (...)। अगर फ़ाइल को पढ़ा नहीं जा सकता है तो requon भी php उदाहरण को रोक देगा।

Because include() is a special language construct, parentheses are not needed around its argument. Take care when comparing return value.

वास्तव में यह सिर्फ एक पैरामीटर है और अतिरिक्त कोष्टक में यह लपेटकर नहीं करता है:

+4

शानदार जवाब। इसे जोर दिया जाना चाहिए कि requ_once एक समारोह नहीं है। यह एक यूनरी ऑपरेटर (या भाषा निर्माण, यदि आप चाहें) है, तो इको, नया, शामिल इत्यादि है। –

+0

धन्यवाद! थोड़े बेकार हालांकि यद्यपि 'मरने() 'को एक स्वीकार्य तरीके से जोड़कर, यह एक त्रुटि फेंकता है जो फ़ाइल को खोजने में विफलता की तरह दिखता है और/या इसकी आवश्यकता होती है - या- फ़ाइल में एक त्रुटि ... वास्तव में यह 'आवश्यकता() या मरने पर खराब कोड है() ' – aequalsb

12

include के रूप में एक विशेष भाषा निर्माण और नहीं एक समारोह है, यह paremeter सूची के लिए paranthesis की जरूरत नहीं है है कुछ भी बदलने:

1 ≡ (1) ≡ ((1)) ≡ (((1))) ≡ …

तो अपने बयान (paremter सिर्फ लपेटा जाता है) इस के समान है:

require_once (('abc.php') or die("oops")); 

इसलिए हमारे पास बूलियन अभिव्यक्ति पैरामीटर है जो सच या झूठी है। और वह मान "1" और "" की स्ट्रिंग बराबर क्रमशः इस प्रकार होगा:

var_dump((string) true === "1"); 
var_dump((string) false === ""); 

कारण है कि इस विफल खोलने के लिए आवश्यक हो '1' त्रुटि संदेश नहीं है यही कारण है कि।

लेकिन सही जगह पर कोष्ठक का उपयोग कर की तरह इस यह काम की तरह आप यह चाहते बनाता है:

(@include_once 'abc.php') or die("oops"); 

यहाँ 'abc.php' स्पष्ट रूप से पैरामीटर है और die("oops") साथ अलगाव include_once की वापसी मूल्य पर किया जाता है। @ operator त्रुटि संदेश को अनदेखा करने के लिए है includ_once फेंक देगा अगर फ़ाइल मौजूद नहीं है।

पीएस: print भी एक विशेष भाषा निर्माण है और उसी तरह काम करता है।

4

होने का मूल्यांकन करते:

require_once ('abc.php') or die("oops"); 

पीएचपी किसी कारण से मूल्यांकन करता है 'या मर जाते हैं ("उफ़")' पहले। "require_once ('abc.php') का मूल्यांकन करने के लिए PHP को मजबूर करने के लिए" इसे ब्रैकेट में घुमाएं।

(require_once ('abc.php')) OR die("oops"); 

हालांकि, अगर "की आवश्यकता होती है" विफल रहता है, पीएचपी बंद हो जाता है प्रसंस्करण इसलिए का उपयोग करने के बजाय (https://stackoverflow.com/a/2418514/1704651 देखें) "शामिल हैं"। इसके अलावा, @_ प्रतीक से पहले प्रतीक @ MySQL से त्रुटि संदेश को दबाता है, इसलिए केवल "ओओपीएस" आउटपुट होता है।

(@include_once ('abc.php')) OR die("oops"); 

अपेक्षित कार्य करता है।

स्रोत: मेरा अपना हताशा और https://bugs.php.net/bug.php?id=22342

+0

शामिल है या मर गया है जो मैंने भी उपयोग किया था। यह तब उपयोगी होता है जब आपको यह स्पष्ट करने की आवश्यकता होती है कि फ़ाइल क्यों गुम है (उदा। कॉन्फ़िगर करने के लिए आपको एक कॉन्फ़िगरेशन फ़ाइल की आवश्यकता है) – jocull

+0

शामिल करने से पहले @ डालना शायद एक बुरा विचार है। @include शामिल फ़ाइल में सभी त्रुटियों का कारण बनता है, और उस फ़ाइल द्वारा शामिल की गई किसी भी फाइल को दबाने के लिए, जो समस्या निवारण और दुःस्वप्न को संभालने में त्रुटि करता है। –

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