2011-08-31 11 views
9

संभव डुप्लिकेट:
Why do some experienced programmers write expressions this way?क्या PHP में पहले शून्य का उपयोग करने का कोई फायदा है?

मैं इस बारे में बस उत्सुक हूँ: सबसे चौखटे/खुला स्रोत परियोजनाओं में मैं अध्ययन किया है, मैं अक्सर इस तरह कोड देखा ...

<?php 

if (null === self::$_instance) { 
    self::$_instance = new self(); 
} 

विशेष रूप से यह लाइन ...

if (null === self::$_instance) { 

क्यों if बयान के पहले तर्क के बजाय दूसरी तरह के आसपास? में null का उपयोग करें ...

if (self::$_instance === null) { 

मुझे पता है वहाँ शायद कोई प्रदर्शन वृद्धि या ऐसा कुछ है। क्या यह सिर्फ एक वरीयता है या क्या यह किसी प्रकार का कोडिंग मानक है जिसे मैंने अनदेखा किया है?

+2

व्यक्तिगत रूप से, मैं कहना है कि वे सब होना चाहिए 'इच्छुक हूँ if (! स्वयं :: $ _ उदाहरण)' – cwallenpoole

+0

यदि यह एक dup मैं अपने कीबोर्ड –

+5

खाने देंगे अंकन शैली को "योदा भाव पता है कि नहीं है "या" योडा स्थितियां "। – mario

उत्तर

12

यह गलती से एक चर के लिए मान निर्दिष्ट करने से रोकता है, खासकर जब केवल ढीली प्रकार तुलना (==) का उपयोग:

if (self::$_instance = NULL) { … } // WHOOPS!, self::$_instance is now NULL 

की स्थिति की यह शैली अक्सर yoda conditions कहा जाता है। प्रदर्शन के अनुसार कोई अंतर नहीं है, दोनों कथन समकक्ष हैं।

if (self::$_instance = null) ... //oops! 
0

यह null करने के लिए विशेष नहीं है - मैंने देखा है कई कोडर उनके भाव इस तरह दौर लिखने के लिए पसंद करते हैं:

if(8 == 4 * 2) { 

यह सिर्फ एक वरीयता जो कुछ लोगों को लगता है कि स्पष्ट है।

+0

यह एक शर्त नहीं है, यह एक असाइनमेंट है, जो असफल हो जाएगा;) निश्चित रूप से आप बस टाइप किया गया है। – Layke

+0

यह एक संकलित समय त्रुटि है, आप 8 – knittl

+2

@Layke को मान निर्दिष्ट नहीं कर सकते हैं: यही कारण है कि कोई इसे दूसरे तरीके से लिखता है: टाइपो संकलन त्रुटियों में बदल जाता है – knittl

6

यह आकस्मिक काम को रोकने के लिए मुख्य रूप से है। इस तरह अभिव्यक्ति लिखने का सामान्य लाभ रक्षात्मक प्रोग्रामिंग है। हम समानता तुलना के बजाय गलती से असाइनमेंट का उपयोग करना चाहते हैं:

if (self::$_instance = null) { ... 

वूप्स!

4

कोई महत्वपूर्ण प्रदर्शन अंतर नहीं है:

+0

वाह, तीन वस्तुतः समान एक साथ जवाब था। किसी को कोक का बकाया है। –

3

यह आपको अपना कोड सही करने में मदद करने के लिए है।

आप ऐसा करते हैं तो आपके कोड काम करेंगे, लेकिन प्रभाव आप क्या चाहते हैं से एक लंबा रास्ता तय हो जाएगा:

if (self::$instance = null) { 

, सशर्त हमेशा असफल हो जायेगी (क्योंकि = ऑपरेटर मूल्य सेट देता है और यह झूठा है) लेकिन self::$instance अब null पर सेट हो जाएगा। यह वही नहीं है जो आप चाहते हैं।

यदि आप करते हैं इस:

if (null = self::$instance) { 

अपने कोड, काम करने के लिए असफल हो जायेगी क्योंकि आप null उपयोग नहीं कर सकते के बाएं साइड पर (या एक स्ट्रिंग या एक पूर्णांक के रूप में किसी भी शाब्दिक इस तरह के) सौंपा गया कार्य। केवल वेरिएबल = ऑपरेटर के बाईं ओर हो सकते हैं।

तो यदि आप == को = के रूप में गलत टाइप करते हैं, तो आपको एक पार्स त्रुटि मिलती है और आपका कोड पूरी तरह से काम नहीं करता है। यह एक रहस्यमय और हार्ड-टू-ट्रैक-डाउन बग के लिए बेहतर है।

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

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