2009-10-08 17 views
20

कुछ भाषाओं में, आप बाएं से दाएं जब तक यह एक सही मूल्य पाता है या शॉर्ट सर्किट, केवल मूल्यों का मूल्यांकन होगाक्या कोई शॉर्ट सर्किट है या PHP में जो बाएं-सबसे अधिक मूल्य देता है?

$a = $b OR $c OR die("no value");

है, कर सकते हैं। लेकिन इसके अलावा, यह वास्तविक मान का मूल्यांकन करता है जिसका मूल्यांकन किया गया था, केवल true के विपरीत।

उपरोक्त उदाहरण में, PHP में, $a मूल्य 1 यदि या तो $a या $b गैर झूठी मान हैं हो जाएगा, या यह die होगा।

तो लिखा एक समारोह first,

$a = first($a, $b, die("no value"));

जो मूल्य या तो $a या $b की रिटर्न के रूप में प्रयोग की जाने वाली। लेकिन, यह शॉर्ट-सर्किट नहीं है - यह हमेशा die होगा।

क्या PHP में शॉर्ट-सर्किट OR है जो वास्तविक मान देता है?

संपादित करें: उदाहरण मैं दे दी है के लिए कुछ अच्छी जवाब है, लेकिन मुझे लगता है कि मेरी उदाहरण वास्तव में मैं क्या मतलब नहीं है। मुझे स्पष्टीकरण दें।

$a = func1() OR func2() OR func3();

कहाँ उन कार्यों में से प्रत्येक एक वास्तव में बहुत तीव्र गणना करता है, तो मैं केवल ज्यादा से ज्यादा एक बार प्रत्येक अभिव्यक्ति का मूल्यांकन करना चाहते। और पहले एक वास्तविक मूल्य वापस करने के लिए, मैं चाहता हूं कि वास्तविक मान $a में संग्रहीत किया जाए।

मुझे लगता है कि हम एक समारोह लिखने से इंकार कर सकते हैं, क्योंकि यह शॉर्ट-सर्किट नहीं होगा। और सशर्त ऑपरेटर उत्तर प्रत्येक अभिव्यक्ति का दो बार मूल्यांकन करेगा।

+2

यह निश्चित रूप से हमेशा मर जाएगा। जब आप कोई फ़ंक्शन कॉल करते हैं, तो PHP को पहले सभी पैरामीटर का मूल्यांकन करना होगा। मूल्यांकन के दौरान, यह 'मर जाता है ("कोई मूल्य नहीं") देखता है और बस यही करता है। – Tom

+1

जब हम चर के बारे में बात कर रहे थे तो प्रत्येक अभिव्यक्ति का मूल्यांकन दो बार ठीक था। आपको पहली बार अपने प्रश्न का जादू करना होगा, और अतिरिक्त जानकारी पेश करने के बाद उत्तर की आलोचना नहीं करना चाहिए जो पहली बार उपलब्ध नहीं था। यदि आप कार्यों का मतलब है, तो पहली बार कार्यों का उपयोग करें। सबसे अच्छा जवाब अब अराजकता है "नंबर" –

+1

टिप्पणी # 2 गलत है। PHP में शॉर्ट-सर्किट मूल्यांकन होता है लेकिन AFAIK बाएं सबसे अधिक vale वापस नहीं करता है। यह हमेशा एक बूलियन देता है। – apinstein

उत्तर

10

तुम बस का उपयोग कर सकते हैं:

$a = func1() or $a = func2() or $a = func3(); 

या मैं कुछ याद आ रही है?

+0

बिल्कुल वही नहीं जो मैं खोज रहा था, लेकिन यह साफ है और यह काम करता है। धन्यवाद। – Steve

+16

"साफ" के पर्याप्त गंदे मूल्यों के लिए। – chaos

+3

मैं जवाब को ऊपर उठाऊंगा लेकिन यह अच्छा होगा अगर मैं भाषा को कम कर सकता –

28

नहीं, ऐसा नहीं है, और यह मेरी राय में, रासमस लेरडोर्फ ने PHP को डिजाइन करने में किए गए बुरे निर्णयों में से एक है जो अक्षम लोगों को कोडिंग करने के लिए सक्षम डेवलपर्स को सबसे ज्यादा प्रभावित करता है।

संपादित करें: PHP 5.3 और बाद में, आप $a = $b ?: $c, और यहां तक ​​कि $a = $b ?: $c ?: $d लिख सकते हैं। अभी भी गैर-मस्तिष्क-क्षतिग्रस्त तार्किक ऑपरेटरों के रूप में उतना अच्छा नहीं है, लेकिन यह कुछ है।

function coalesce() { 
    foreach (func_get_args() as $arg) { 
     if ($arg) { 
      return $arg; 
     } 
    } 
    return null; 
} 

$a = coalesce($a, $b) or die("no value"); 
+3

?: वाक्यविन्यास, IMHO, पूरी तरह से अपठनीय है। शॉर्ट-सर्किट इतने बेहतर होते थे कि यह तुलनीय भी नहीं है:/ –

+6

आपको मुझसे कोई तर्क नहीं मिलेगा, महोदय। – chaos

2

आप coalesce function किसी तरह का इस्तेमाल कर सकते हैं?

function coalesce($funcs) 
{ 
    foreach ($funcs as $func) 
    { 
     //Catch language constructs 
     switch($func) 
     { 
      case 'die': 
       die(); 
     } 
     $result = $func(); 
     if ($result) 
     { 
      return $result; 
     } 
    } 
} 
+0

यह लॉजिकल ऑपरेटरों के ठीक से काम करने वाले सेट के बराबर नहीं है (यह जटिल अभिव्यक्तियों या फ़ंक्शन कॉल को शॉर्ट-सर्किट होने की अनुमति नहीं देता है, और निश्चित रूप से यह अधिक ओवरहेड है), लेकिन यह कुछ है। – chaos

+1

यह अच्छा है, लेकिन एक वास्तविक शॉर्ट-सर्किट OR के विपरीत, प्रत्येक तर्क को सहारा देने का मूल्यांकन करेगा। उदाहरण के लिए, coalesce (true, launch_missiles()) या मर जाते हैं ("अंत निकट है") अभी भी मिसाइलों को लॉन्च किया जाएगा। – Shawn

1

चर कार्यों के बारे में क्या:

0

यह काम करना चाहिए:

$a = (($f1=func1()) ? $f1 : ($f2=func2()) ? $f2 : func3())); 
1

मैं माफी चाहता हूँ, लेकिन ये जवाब के सबसे बस बंद कर रहे हैं।

$ ए = $ बी या $ सी या मर ("कोई मूल्य नहीं");

$a = $b ?: $c ?: die("no value"); 

कारण बन जाता है या काम नहीं करता है कि बजाय पूर्व या बाद के मूल्य लौटने के बजाय यह सही या गलत रिटर्न है।

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