2012-05-25 13 views
10

डबल उद्धृत तारों में PHP समर्थन परिवर्तनीय इंटरपोलेशन, उदा।फ़ंक्शन आउटपुट के लिए PHP इंटरपोलिंग स्ट्रिंग

$s = "foo $bar"; 

लेकिन क्या डबल कॉलेड स्ट्रिंग में फ़ंक्शन कॉल परिणामों को अलग करना संभव है?

उदा

$s = "foo {bar()}"; 

ऐसा कुछ? सही नहीं लगता है?

+2

हाँ यह संभव नहीं है। – Ibu

+0

को आजमाकर आप अपना जवाब प्राप्त कर सकते हैं क्या आपका मतलब * इंटरपोलिंग * या * व्याख्या * है? – hakre

उत्तर

2

PHP में डबल कोट सुविधा PHP कोड का मूल्यांकन नहीं करती है, यह बस अपने मूल्यों के साथ चर बदलती है। आप वास्तव में गतिशील रूप से (बहुत ही खतरनाक) PHP कोड का मूल्यांकन करना चाहते हैं, तो आप eval उपयोग करना चाहिए:

eval("function foo() { bar() }"); 

या यदि आपने अभी एक समारोह बनाना चाहते हैं:

$foo = create_function("", "bar()"); 
$foo(); 

इसका उपयोग तभी करें अगर वहाँ वास्तव में है कोई दूसरा विकल्प नहीं।

+1

समारोह एक वर्ग के अंदर था, तो आप यह स्ट्रिंग के अंदर उल्लेख कर सकते हैं, उदाहरण के लिए: '$ s = "foo {$ this-> बार()}", ' – nawfal

14

ओवरव के उत्तर के रूप में स्ट्रिंग-टू-फ़ंक्शन-नाम कॉलिंग तकनीक का उपयोग करना बिल्कुल संभव है। कई तुच्छ प्रतिस्थापन मामलों में यह अब तक इस तरह के

"<input value='<?php echo 1 + 1 + foo()/bar(); ?>' />" 

आप एक चर की जरूरत के रूप में वैकल्पिक वाक्यविन्यास की तुलना में बेहतर पढ़ता है, क्योंकि पार्सर उम्मीद $ वहाँ हो। यह वह जगह है जहां पहचान tranform एक वाक्य रचनात्मक हैक के रूप में अच्छी तरह से काम करता है। बस एक पहचान समारोह का ऐलान करते हैं और दायरे में एक चर के नाम असाइन:

function identity($arg){return $arg;} 
$interpolate="identity"; 

तो फिर तुम समारोह तर्क के रूप में किसी भी मान्य PHP व्यंजक पारित कर सकते हैं:

"<input value='{$interpolate(1 + 1 + foo()/bar())}' />" 

उल्टा आप कर सकते हैं वह यह है कि छोटे स्थानीय चर और गूंज बयान के बहुत सारे को खत्म करें।

नकारात्मक पक्ष यह है कि $ लगाना चर, क्षेत्र से बाहर गिर जाता है तो आप बार-बार यह कार्य करता है और तरीकों की वैश्विक अंदर घोषित करने के लिए होता है।

1

जब तक प्रक्षेप बिल्कुल जरूरी है (टिप्पणी कृपया और मुझे इसका कारण बताएं), तार के साथ समारोह उत्पादन श्रेणीबद्ध।

$s = "foo " . bar();

स्रोत: http://docstore.mik.ua/orelly/webprog/pcook/ch01_08.htm

+0

ठीक है, लेकिन वास्तव में इस सवाल का जवाब नहीं है; -) – Blackbam

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