2009-03-11 17 views
5

कुछ लोगों की तरह, सी # बहुत उपयोगी है ?? ऑपरेटर जो बायीं ओर अभिव्यक्ति शून्य पर अभिव्यक्ति का मूल्यांकन करता है और दाईं ओर अभिव्यक्ति देता है। यह उदाहरण के लिए, डिफ़ॉल्ट मान प्रदान करने के लिए बहुत उपयोगी है:PHP और ?? ऑपरेटर

int spaces = readSetting("spaces") ?? 5; 

तो readSetting"spaces" नहीं पा सके और अशक्त देता है, चर spaces5 का डिफ़ॉल्ट मान पकड़ होगा।

आप हालांकि आप दोनों रूबी और जावास्क्रिप्ट में इस मामले में जावास्क्रिप्ट में spaces के मूल्य और false रूप 0 नहीं कर सकता || ऑपरेटर के साथ जावास्क्रिप्ट और रूबी में लगभग एक ही कर सकता है,

var spaces = readSetting("spaces") || 5; 

में के रूप में ।

पीएचपी or ऑपरेटर है और हालांकि यह एक भावना है कि यह सही से अभिव्यक्ति वापस नहीं करता है में || के रूप में काम नहीं करता है, यह अभी भी यहाँ उपयोगी हो सकता है:

$spaces = readSetting('spaces') or $spaces = 5; 
ध्यान दें कि "" साथ

और "0" को false जैसे पीएचपी में false, 0 और null के साथ अधिकांश भाषाओं में भी माना जाता है।

सवाल यह है कि, क्या मुझे ऊपर से निर्माण का उपयोग करना चाहिए? क्या इसमें बड़े वर्गों के पात्रों को झूठा मानने के अलावा साइड इफेक्ट्स हैं? और क्या वहां कोई बेहतर निर्माण है जिसका उपयोग आमतौर पर PHP समुदाय द्वारा किया जाता है और अनुशंसित किया जाता है?

उत्तर

1

आप गारंटी नहीं है कि आप गलत या अशक्त मिलता है, और जैसी चीजों का इलाज नहीं चाहते हैं "0" के रूप में "गलत", आप निम्न कर सकता है:

$spaces = readSetting('spaces'); 
if($spaces == null || $spaces === false) $spaces = 5; 

PHP में === ऑपरेटर एक के लिए लग रहा है समान मिलान, इसलिए "0", "", झूठी के बराबर नहीं होगा। जाहिर है आप कोड को अपनी पसंद के अनुसार कोड को पुन: स्थापित करना चाहते हैं, लेकिन आपको विचार मिलता है।

6

इस तरह के मामलों में अधिक स्पष्ट होना एक अच्छा विचार है, खासकर PHP में क्योंकि इसमें कुछ भ्रमित प्रकार रूपांतरण नियम हैं (उदाहरण के लिए "0" गलत है जैसा आपने इंगित किया है)।

यदि आप सख्त होना चाहते हैं, तो अपने फ़ंक्शन को readSettings सही सेटिंग या एक अच्छी तरह से परिभाषित मान दें यदि कोई सेटिंग नहीं मिली है, उदा। null। तो आप इसका इस्तेमाल करना चाहिए के रूप में:

$spaces = readSettings('spaces'); 
if (null === $spaces) { 
    $spaces = 5; 
} 

आप अधिक उदार होना चाहते हैं और केवल चाहते हैं $ रिक्त स्थान खाली नहीं होना करने के लिए, का उपयोग करें, तो:

$spaces = readSettings('spaces'); 
if (empty($spaces)) { // or: if (!$spaces) { 
    $spaces = 5; 
} 

आप एक की लागत से इसे छोटा कर सकता है दूसरा समारोह कॉल या बदसूरत निर्माणों (अनुशंसित नहीं):

$spaces = readSettings('space') ? readSettings('space') : 5; 
$spaces = ($x = readSettings('space')) ? $x : 5; // UGLY! 

लेकिन देखना अगर आप 0 चाहते $spaces लिए एक मान्य मान हो सकता है!

Zen of Python से:

स्पष्ट अंतर्निहित से बेहतर है।

आपके मामले में मैं सिर्फ एक दूसरे पैरामीटर $defaultreadSettings() में जोड़ने के लिए सिफारिश करेंगे:

function readSettings($key, $default=null) { 
    return isset($settings[$key]) ? $settings[$key] : $default; 
} 

$spaces = readSettings('spaces', 5); 
4

कैसे इस बारे में?

$spaces = ($tmp=readSettings('space')) ? $tmp : 5; 

या, भ्रामक, लेकिन केवल एक चर का उपयोग कर:

$spaces = ($spaces=readSettings('space')) ? $spaces : 5; 
6

पीएचपी 5.3.0 त्रिगुट ऑपरेटर हालत के संक्षिप्त संस्करण देता है सच: झूठी जो चला जाता है इस प्रकार है:

$spaces = readSettings('spaces') ?: 5;

कृपया ध्यान दें कि PHP 5.3.0 अभी भी बीटा में है और अभी तक उत्पादन तैयार नहीं है (यह पहले से ही एक रिलीज उम्मीदवार है), लेकिन यह लैम्ब्डा फ़ंक्शंस और नेमस्पेस जैसे नए कूल सामान भी प्रदान करता है, इसलिए यह निश्चित रूप से है सुविधाओं की जांच करने के लायक!

यहाँ एक लेख है कि नई सुविधाओं का वर्णन करता है बहुत अच्छी तरह से है:

http://www.sitepoint.com/article/whats-new-php-5-3/

+0

मैं के लिए किसी भी संदर्भ नहीं देख सकते हैं: जुड़े हुए लेख में। –

1

पीएचपी 7 अब समर्थन करता है ?? अशक्त कोलेसिंग ऑपरेटर

के रूप में अशक्त कोलेसिंग ऑपरेटर (??) isset साथ संयोजन के रूप में एक त्रिगुट के प्रयोग की आवश्यकता के आम मामले के लिए वाक्यात्मक चीनी के रूप में जोड़ दिया गया है()। यदि यह अस्तित्व में है और यह पूर्ण नहीं है तो यह अपना पहला ऑपरेंड देता है; अन्यथा यह अपना दूसरा ऑपरेंड देता है।

<?php 
// Fetches the value of $_GET['user'] and returns 'nobody' 
// if it does not exist. 
$username = $_GET['user'] ?? 'nobody'; 
// This is equivalent to: 
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; 

// Coalescing can be chained: this will return the first 
// defined value out of $_GET['user'], $_POST['user'], and 
// 'nobody'. 
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody'; 
?> 

http://php.net/manual/en/migration70.new-features.php

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