2010-09-04 11 views
9

Google (और मेरा स्वयं का अनुभव) के माध्यम से कुछ खोज से पता चलता है कि PHP में आप एक सरणी तत्व नहीं ले सकते हैं जब इसे उसी पंक्ति पर फ़ंक्शन कॉल से वापस किया जाता है। उदाहरण के लिए, आप नहीं कर सकते:फ़ंक्शन से लौटने पर एक सरणी तत्व तक पहुंच

echo getArray()[0]; 

हालांकि, मैं एक साफ थोड़ा चाल का सामना करना पड़ा:

echo ${!${false}=getArray()}[0]; 

यह वास्तव में काम करता है। समस्या यह है कि, मुझे नहीं पता क्यों यह काम करता है। अगर कोई समझा सकता है, तो यह बहुत अच्छा होगा।

धन्यवाद।

+1

यह निश्चित रूप से करता है ** नहीं ** अपने कोड अधिक पठनीय बनाने के;) –

उत्तर

10
echo ${!${false}=getArray()}[0]; 

यह है कि यह कैसे, काम करता है कदम

${false}=getArray() 

द्वारा कदम है करने के लिए getArray का परिणाम प्रदान करती है एक खाली नाम वाला एक चर ('' या शून्य शून्य के बजाय काम करेगा)

!${false}=getArray() 

ऊपर मूल्य को नकारता, यह गलत

${!${false}=getArray()} 

एक (खाली) स्ट्रिंग के लिए पिछले (गलत) मूल्य धर्मान्तरित और इस स्ट्रिंग एक चर नाम के रूप में उपयोग करता बूलियन में बदल जाएगा। यही है, यह चरण 1 से चर है, getArray के परिणाम के बराबर है।

${!${false}=getArray()}[0]; 

उस "खाली" चर के सूचकांक लेता है और एक सरणी तत्व देता है।

एक ही विचार

echo ${1|${1}=getArray()}[1]; 
echo ${''.$Array=getArray()}[1]; 

function p(&$a, $b) { $a = $b; return '_'; } 
echo ${p($_, getArray())}[1]; 

क्यों getArray()[0] काम नहीं करता है के रूप में से कुछ अधिक विविधताओं, इस वजह से php टीम कोई सुराग नहीं है कि यह कैसे काम करने के लिए प्राप्त करने के लिए है।

+0

बिल्कुल सही है, धन्यवाद। – Daniel

+0

महान उदाहरण, बहुत जानकारीपूर्ण +1 – RobertPitt

3

यह काम करता है क्योंकि आप ब्रेसिज़ का उपयोग मूल्य को एक varialbe में बदलने के लिए करते हैं, एक उदाहरण है।

इसकी आवश्यकता क्यों है, इस की जरूरत है डिब्बे में बंद आप एक चर में एक स्ट्रिंग या दिए गए मान चालू करना चाहते हैं, उदाहरण के

${$_GET['var']} = true; 

यह बुरा व्यवहार है और IMO कभी नहीं किया जाना चाहिए।

आप वस्तुओं का उपयोग करना चाहिए अगर आप सीधे कार्यों बंद चलाना चाहते हैं, उदाहरण के

function test() 
{ 
    $object = new stdClass(); 
    $object->name = 'Robert'; 

    return $object; 
} 
echo test()->name; 
2

यह ध्यान दिया जाना चाहिए कि आप इसे PHP 5.4 के रूप में कर सकते हैं। सरणी dereferencing पर मैनुअल से:

PHP 5.4 के रूप में किसी फ़ंक्शन या विधि कॉल के परिणाम को सीधे अस्वीकार करना संभव है। एक अस्थायी चर का उपयोग कर केवल यह संभव था।

उदाहरण:

function theArray() { 
    return range(1, 10); 
} 

echo theArray()[0]; 
// PHP 5.4+: 1 
// PHP -5.4: null 

पूर्व पीएचपी 5.4: एक सरणी कुंजी जो निर्धारित नहीं किया गया उपयोग करने के लिए प्रयास कर रहा है किसी भी अन्य अपरिभाषित चर तक पहुँचने के रूप में ही है: एक E_NOTICE स्तरीय त्रुटि संदेश हो जाएगा जारी किया गया, और परिणाम न्यूल होगा।

मैनुअल:

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