कई प्रोग्रामिंग भाषाओं में एक सहक्रियाशील फ़ंक्शन होता है (पहला गैर-पूर्ण मान लौटाता है, उदाहरण )। PHP, दुख की बात है कि 2009 में, नहीं।
PHP में एक को लागू करने का एक अच्छा तरीका क्या होगा जब तक कि PHP खुद एक कोलेसस फ़ंक्शन नहीं करता है?
कई प्रोग्रामिंग भाषाओं में एक सहक्रियाशील फ़ंक्शन होता है (पहला गैर-पूर्ण मान लौटाता है, उदाहरण )। PHP, दुख की बात है कि 2009 में, नहीं।
PHP में एक को लागू करने का एक अच्छा तरीका क्या होगा जब तक कि PHP खुद एक कोलेसस फ़ंक्शन नहीं करता है?
जवाबों:
Php 5.3 में एक नया ऑपरेटर है जो यह करता है: ?:
// A
echo 'A' ?: 'B';
// B
echo '' ?: 'B';
// B
echo false ?: 'B';
// B
echo null ?: 'B';
$input['properties']['range_low'] ?: '?'
array() ?: null ?: false
रिटर्न करते हैं false
। ऑपरेटर वास्तव में समझदार है।
PHP 7 ने एक वास्तविक मोटे ऑपरेटर की शुरुआत की :
echo $_GET['doesNotExist'] ?? 'fallback'; // prints 'fallback'
यदि मान ??
मौजूद नहीं है या लिया null
जाने के बाद मान ??
है।
उल्लिखित ?:
ऑपरेटर पर सुधार ??
यह है कि, बिना फेंक दिए अपरिभाषित चर भी संभालता है E_NOTICE
।
($_GET['doesNotExist'] ?? null) ?: 'fallback'
?:
अधिक ??
, तथापि, कि यह अच्छी तरह से जो के रूप में खाली मान coalesces है ??
नहीं करता है। तार्किक या जावास्क्रिप्ट (यानी में ऑपरेटर के व्यवहार के समान $val || 'default'
), मैं पाते हैं ?:
की एक और अधिक व्यावहारिक रूप होने वालों हमारे व्यवहार में अगर हम अंत में खुद को संभालने दोनों को खोजने के खाली और अशक्त उसी तरह (यानी में $val ?: 'default'
)। और अगर आप इस मुद्दे को और ज़ोर देना चाहते हैं E_NOTICE
, तो आप इस पर भी बहस कर सकते हैं:echo @$val ?: 'default';
पहले गूगल पर "php coalesce" के लिए हिट।
function coalesce() {
$args = func_get_args();
foreach ($args as $arg) {
if (!empty($arg)) {
return $arg;
}
}
return NULL;
}
मुझे वास्तव में पसंद है ?: ऑपरेटर। दुर्भाग्य से, यह अभी तक मेरे उत्पादन वातावरण पर लागू नहीं हुआ है। इसलिए मैं इसके बराबर का उपयोग करता हूं:
function coalesce() {
return array_shift(array_filter(func_get_args()));
}
coalesce
होना चाहिए - पहले गैर-शून्य तर्क को वापस करना है जो इसका सामना करता है, जिसमें शामिल होगा FALSE
। यह फ़ंक्शन FALSE
हालांकि त्याग देगा , शायद ऐसा नहीं है कि ऑप को ध्यान में रखा गया हो (कम से कम वह नहीं जो मैं किसी coalesce
फ़ंक्शन से बाहर चाहता हूं )।
यह ध्यान देने योग्य है कि PHP के बिना वैरिएबल चर और सरणी सूचकांकों के उपचार के कारण, किसी भी प्रकार के मोटे फ़ंक्शन सीमित उपयोग के हैं। मैं ऐसा करने में सक्षम होना पसंद करूंगा:
$id = coalesce($_GET['id'], $_SESSION['id'], null);
लेकिन यह, ज्यादातर मामलों में, एक E_NOTICE के साथ PHP को त्रुटि का कारण बना देगा। इसका उपयोग करने से पहले एक चर के अस्तित्व का परीक्षण करने का एकमात्र सुरक्षित तरीका है कि इसे सीधे खाली () या isset () में उपयोग करें। केविन द्वारा सुझाए गए टर्नरी ऑपरेटर सबसे अच्छा विकल्प है यदि आप जानते हैं कि आपके कोलेस में सभी विकल्पों को प्रारंभिक रूप से जाना जाता है।
$getstuff = $_GET+$_SESSION+array('id'=>null);$id=$getstuff['id'];
)।
??
का परिचय देता है ।
सुनिश्चित करें कि आप इस प्रकार की पहचान करना चाहते हैं कि आप इस फ़ंक्शन को कुछ प्रकार के साथ कैसे काम करना चाहते हैं। PHP में विभिन्न प्रकार की जाँच या समान कार्य होते हैं, इसलिए सुनिश्चित करें कि आप जानते हैं कि वे कैसे काम करते हैं। यह is_null () और रिक्त () की तुलना का एक उदाहरण है
$testData = array(
'FALSE' => FALSE
,'0' => 0
,'"0"' => "0"
,'NULL' => NULL
,'array()'=> array()
,'new stdClass()' => new stdClass()
,'$undef' => $undef
);
foreach ( $testData as $key => $var )
{
echo "$key " . (( empty( $var ) ) ? 'is' : 'is not') . " empty<br>";
echo "$key " . (( is_null( $var ) ) ? 'is' : 'is not') . " null<br>";
echo '<hr>';
}
जैसा कि आप देख सकते हैं, खाली () इन सभी के लिए सही है, लेकिन is_null () केवल उनमें से 2 के लिए ऐसा करता है।
मैं एतान केंट द्वारा पोस्ट किए गए उत्तर पर विस्तार कर रहा हूं । यह उत्तर गैर-अशक्त तर्कों को छोड़ देगा जो कि array_filter के आंतरिक कामकाज के कारण झूठे का मूल्यांकन करते हैं , जो कि coalesce
आमतौर पर एक फ़ंक्शन नहीं करता है। उदाहरण के लिए:
echo 42 === coalesce(null, 0, 42) ? 'Oops' : 'Hooray';
उफ़
इसे दूर करने के लिए, एक दूसरे तर्क और फ़ंक्शन परिभाषा की आवश्यकता होती है। प्रतिदेय समारोह बताने के लिए जिम्मेदार है array_filter
या नहीं, परिणाम सरणी के लिए वर्तमान सरणी मान जोड़ने के लिए:
// "callable"
function not_null($i){
return !is_null($i); // strictly non-null, 'isset' possibly not as much
}
function coalesce(){
// pass callable to array_filter
return array_shift(array_filter(func_get_args(), 'not_null'));
}
यह अच्छा होगा यदि आप बस 2 तर्क के रूप में पास isset
या पास कर सकते हैं , लेकिन ऐसा कोई भाग्य नहीं है।'isset'
array_filter
PHP 5.3+, बंद होने के साथ:
function coalesce()
{
return array_shift(array_filter(func_get_args(), function ($value) {
return !is_null($value);
}));
}
डेमो: https://eval.in/187365
??