2015-10-26 12 views
7

का परिणाम:PHP ऑपरेटर प्राथमिकता बग?

var_dump(null != $a = 15); 
var_dump($a); 

है:

bool(true) 
int(15) 

क्यों इस स्क्रिप्ट में कोई त्रुटि ट्रिगर नहीं कर रहा? != (बराबर ऑपरेटर नहीं) = (असाइनमेंट ऑपरेटर) की तुलना में अधिक प्राथमिकता है, $a की तुलना null से पहले की जानी चाहिए?

+0

निश्चित रूप से अजीब। '$ a == null = 15' भी झूठी डंप देता है। और '(शून्य! = $ ए) = 15' में डालकर एक अप्रत्याशित '=' त्रुटि थूकती है। –

+0

इसे 'शून्य! = ($ A = 15)' के रूप में व्याख्या करने का क्या विकल्प है? '(शून्य! = $ ए) = 15' के साथ आप एक बूलियन मान के लिए मान 15 असाइन करने का प्रयास करेंगे; यह काम नहीं करता है। – VolkerK

+0

@ वोल्करके यह एक उदाहरण है, इस लिपि में कोई वास्तविक जीवन उद्देश्य नहीं है! मेरा प्रतिबिंब इस प्रकार की अभिव्यक्ति से शुरू होता है जो मैं देखता हूं (और उपयोग करता हूं) बहुत कुछ 'अगर (! $ A = foo()) '। –

उत्तर

6

एकमात्र कारण मैं पा सकते हैं प्रलेखन का कहना है कि कि यह अभी भी कानूनी है: http://php.net/manual/en/language.operators.precedence.php#example-129

यह क्या उपरोक्त तालिका में दिखाया जाता है के लिए एक अपवाद हो रहा है।

+0

इस छोटे से नोट पर अच्छा पकड़ो! –

+3

मुझे लगता है कि एक अन्य बात ध्यान देने योग्यता पर निम्नलिखित टिप्पणी है: "ब्रांड्स का उपयोग, कड़ाई से जरूरी नहीं होने पर भी, अंतर्निहित ऑपरेटर प्राथमिकता और सहयोगीता पर भरोसा करने के बजाय समूह को स्पष्ट करके समूह की पठनीयता को बढ़ा सकता है।" –

+0

यह "जानबूझकर अपवाद" नहीं है; स्पष्ट रूप से "अनुमति" देने के लिए कोई addional lexer नियम नहीं है। यह सिर्फ सामान्य तरीका है जो यह काम करता है। मैनुअल में उदाहरण डेवलपर्स के लिए सिर्फ एक अनुस्मारक है जो आश्चर्य करते हैं। – VolkerK

2

यह ऑपरेटर प्राथमिकता के बारे में नहीं है लेकिन इसके बारे में: ऑपरेटर प्राथमिकता सूची आपको विवरण नहीं बताती (वास्तव में, वे कभी नहीं करते), उदा। बाइसन नियमों और परिणामी पैटर्न मिलान और ढेर को कम करने के बारे में।
var_dump के बिना सादगी के लिए, null != $a = 15; स्टेटमेंट ले लें।
इस प्रकार पार्सर इस कथन को "देखता है" - या देखता है कि यह एक कथन है।
(मुझे आशा है कि यह हर जगह एक फिक्स-चौड़ाई फ़ॉन्ट साथ गाया जाएगा ...)

null      !=     $a         = 15       ; 
               T_VARIABLE       
identifier          compound_variable      T_LNUMBER 
namespace_name         reference_variable      common_scalar 
general_constant         base_variable       scalar 
scalar           base_variable_with_functions_calls  expr_without_variable 
expr_without_variable       variable       = expr 
expr      T_IS_NOT_EQUAL    \______ expr_without_variable _________/ 
    \__________________ expr ____________________________________________/           ; 
          \_________________  unticked_statement _______________________________________________/ 
                statement         

(आप https://github.com/php/php-src/blob/PHP-5.6.15/Zend/zend_language_parser.y पर नियम भी देख सकते हैं)

में असाइनमेंट ऑपरेटर के लिए कोई विशेष नियम नहीं है ये मामला; पार्सर के बयान से मेल खाने के लिए बस एक और तरीका नहीं है, इसलिए प्राथमिकता लागू नहीं होती है।

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