पीएचपी - स्ट्रिंग में कंसट्रेट या सीधे वेरिएबल डालें


224

मैं सोच रहा हूँ, PHP चर को एक तार में डालने का उचित तरीका क्या है?

इस तरफ:

echo "Welcome ".$name."!"

या इस तरह:

echo "Welcome $name!"

ये दोनों तरीके मेरे काम आते हैं PHP v5.3.5। उत्तरार्द्ध छोटा और सरल है, लेकिन मुझे यकीन नहीं है कि पहले बेहतर स्वरूपण है या अधिक उचित के रूप में स्वीकार किया गया है।


18
यदि आप पहली बार कर रहे थे, तो मैं व्यक्तिगत रूप से एकल बोली पसंद echo 'Welcome '.$name.'!';
करता हूं


2
@ kjy112 मैंने अपने जवाब में एक ही बात कही, मैं एक एकल उद्धरण का बहुत बड़ा प्रशंसक हूं: X
Khez

11
व्यक्तिगत रूप से, मैं पूरे "एकल उद्धरण अधिक कुशल हैं" को अनदेखा करता हूं और बस "जो भी उद्धरण शैली का उपयोग करें उसके लिए आंतरिक भागने की अंतिम मात्रा की आवश्यकता होती है"। यह अत्यधिक संभावना नहीं है कि आपके द्वारा लिखा गया कोई भी कोड किसी भी MICROSCOPIC लाभ से कम स्ट्रिंग पार्सिंग बनाम बढ़े हुए स्ट्रिंग संयोजन के कारण लाभ होगा।
मार्क बी

1
प्रदर्शन हानि का दावा गलत है। इस लेख को संदर्भ के रूप में देखें: nikic.github.io/2012/01/09/…
डेमियन

जवाबों:


344

उन दो वाक्यविन्यासों के बीच, आपको वास्तव में उसी को चुनना चाहिए जिसे आप पसंद करते हैं :-)

व्यक्तिगत रूप से, मैं ऐसे मामले में आपके दूसरे समाधान के साथ जाऊंगा (परिवर्तनीय प्रक्षेप) , जो मुझे लिखना और पढ़ना दोनों आसान लगता है।

परिणाम वही होगा; और यहां तक ​​कि अगर प्रदर्शन निहितार्थ हैं, तो वे 1 बात नहीं करेंगे ।


एक विचार के रूप में, इसलिए मेरा उत्तर थोड़ा और पूर्ण है: जिस दिन आप ऐसा कुछ करना चाहेंगे:

echo "Welcome $names!";

PHP आपके कोड की व्याख्या करेगा जैसे कि आप $namesचर का उपयोग करने की कोशिश कर रहे थे - जो मौजूद नहीं है। - ध्यान दें कि यह तभी काम करेगा जब आप अपनी स्ट्रिंग के लिए "" नहीं '' का उपयोग करेंगे।

उस दिन, आपको उपयोग करने की आवश्यकता होगी {}:

echo "Welcome {$name}s!"

संघों को कमबैक करने की आवश्यकता नहीं है।


यह भी ध्यान दें कि आपका पहला सिंटैक्स:

echo "Welcome ".$name."!";

शायद हो सकता है अनुकूलित ,, concatenations से बचने का उपयोग कर:

echo "Welcome ", $name, "!";

(लेकिन, जैसा कि मैंने पहले कहा, यह ज्यादा मायने नहीं रखता ...)


1 - जब तक आप सैकड़ों हजारों कॉन्टैक्लेशन बनाम इंटरपोलेशन नहीं कर रहे हैं - और यह संभवतः काफी मामला नहीं है।


3
बहुत बड़िया धन्यवाद! यह जानकर बहुत अच्छा लगा कि मैं इसे सीधे स्ट्रिंग में डालने की अपनी पसंदीदा विधि का उपयोग कर सकता हूं, और मुझे यह जानने के लिए बहुत धन्यवाद है कि यदि आवश्यकता हो तो शेष स्टिंग से चर को अलग कैसे करें {}
Web_Designer

64
बस एक नोट जो स्ट्रिंग शाब्दिक और चर को अल्पविराम से अलग करता है echo, केवल साथ काम करता है , कहीं और नहीं।
कॉलिनसिमरन

3
केवल प्रदर्शन की ओर इशारा करते हुए: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(कॉनटैसेनेशन) वास्तव में लगभग 300 मिलीसेकंड (200.000 आइटम के लिए, जो आपके सेट पर प्रति हजार तत्वों पर 1 मीलिसेकॉनफ है ...) से हार जाता है। यह सांख्यिकीय शोर है, किसी भी अंतर को मापना असंभव है। इसे और अधिक पठनीय माना जा रहा है, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(इंटरपोल) निर्विवाद विजेता है ...
फर्नांडो कॉर्डिएरो

1
यदि आप प्रक्षेप का उपयोग करना चाहते हैं, तो आपको दोहरे उद्धरण चिह्नों का उपयोग करना होगा।
मक्सिमा कोन्जेज़

क्या स्ट्रिंग के अंदर कार्यों का उपयोग करना संभव है? गूंज की तरह "यह है {foo ()} अच्छा"; ?
स्ट्राइक्स

17

डबल-उद्धृत स्ट्रिंग्स अधिक सुरुचिपूर्ण हैं क्योंकि आपको हर बार अपनी स्ट्रिंग को तोड़ने की ज़रूरत नहीं होती है जब आपको एक चर सम्मिलित करने की आवश्यकता होती है (जैसे कि आपको एकल-उद्धृत स्ट्रिंग्स के साथ करना होगा)।

हालाँकि, यदि आपको किसी फ़ंक्शन का रिटर्न मान सम्मिलित करने की आवश्यकता है, तो इसे डबल-उद्धृत स्ट्रिंग में नहीं डाला जा सकता है - भले ही आप इसे ब्रेसिज़ के साथ घेर लें!

//syntax error!!
//$s = "Hello {trim($world)}!"

//the only option
$s = "Hello " . trim($world) . "!";

10
आप PHP 5.3 चर कार्यों के माध्यम से स्ट्रिंग में परोक्ष रूप से फ़ंक्शन सम्मिलित कर सकते हैं। $x = function() { ...}; $string = "hello {$x(blah blah blah)}", जो "प्रतिबंध" के आसपास काम करता है।
मार्क बी

5
@ मर्क शांत है, मुझे नहीं पता था कि! आप किसी मौजूदा फ़ंक्शन के नाम को एक वैरिएबल पर भी असाइन कर सकते हैं और वही काम कर सकते हैं:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
माइकल

3
यह अच्छा है, लेकिन बहुत ही अपठनीय है, इसलिए, किसी को भी इससे बचना होगा।
आपका कॉमन सेंस

2
$s = 'Hello ' . trim($world) .'!';एकल उद्धरण का उपयोग करने का प्रयास करें जब स्ट्रिंग में प्रक्षेप करने के लिए कुछ भी नहीं है। यह प्रदर्शन में सुधार करेगा और दोनों को पहचानने के लिए एक सम्मेलन के रूप में इस्तेमाल किया जा सकता है
सारथ सदाशिवन पिल्लई

9

Php4 के बाद से आप एक स्ट्रिंग फॉर्मेटर का उपयोग कर सकते हैं:

$num = 5;
$word = 'banana';
$format = 'can you say %d times the word %s';
echo sprintf($format, $num, $word);

स्रोत: स्प्रिंटफ ()


अब तक का सबसे सुरक्षित विकल्प। अन्य भाषाओं से मेल खाते हुए अच्छे अभ्यास और सामान्य सम्मेलन के लिए +1
जेवियर एरियस


5

सोचने के दृष्टिकोण से , सरल , पठनीय , सुसंगत और समझने में आसान है (क्योंकि प्रदर्शन यहाँ कोई फर्क नहीं पड़ता):

  • जब आप ऑब्जेक्ट गुण, बहु-विषयक सरणियों आदि को एम्बेड करना चाहते हैं, तो दोहरे उद्धरण चिह्नों में एम्बेडेड वेरिएशन का उपयोग करने से जटिल और भ्रामक स्थितियां पैदा हो सकती हैं। यानी आमतौर पर एम्बेडेड वेरिएस को पढ़ते समय, आप जो भी पढ़ रहे हैं उसके अंतिम व्यवहार के बारे में 100% सुनिश्चित नहीं हो सकते हैं। ।

  • आप अक्सर इस तरह के रूप बैसाखी जोड़ने की जरूरत है {}और \है, जो IMO भ्रम कहते हैं और, संयोजन पठनीयता लगभग बराबर बना देता है नहीं तो बेहतर।

  • जैसे ही आपको संस्करण के चारों ओर एक फ़ंक्शन कॉल को लपेटने की आवश्यकता होती है, उदाहरण के लिए htmlspecialchars($var), आपको कॉन्टेक्टेशन पर स्विच करना होगा।

  • AFAIK, आप स्थिरांक एम्बेड नहीं कर सकते।

कुछ विशिष्ट मामलों में, "वेरिएबल एम्बेडिंग के साथ दोहरे उद्धरण" उपयोगी हो सकते हैं, लेकिन आम तौर पर बोलते हुए, मैं संघटन के लिए जाऊंगा (सुविधाजनक होने पर एकल या दोहरे उद्धरणों का उपयोग करके)


5

मुझे पता है कि इस प्रश्न का पहले से ही एक चुना हुआ उत्तर है, लेकिन मुझे यह लेख मिला जो स्पष्ट रूप से दिखाता है कि स्ट्रिंग प्रक्षेप, संघनन की तुलना में तेजी से काम करता है। यह उन लोगों के लिए सहायक हो सकता है जो अभी भी संदेह में हैं।


3

पहले के साथ जाओ और एकल उद्धरण का उपयोग करें!

  1. यह पढ़ना आसान है, जिसका अर्थ है कि अन्य प्रोग्रामर्स को पता चल जाएगा कि क्या हो रहा है
  2. यह थोड़ी तेज़ी से काम करता है, जिस तरह से opcodes बनाया जाता है जब PHP आपके सोर्स कोड को डिसाइड करता है, तो यह मूल रूप से वैसे भी ऐसा करने वाला होता है, इसलिए इसे मदद के लिए हाथ दें!
  3. यदि आप दोहरे उद्धरण चिह्नों के बजाय एकल उद्धरणों का उपयोग करते हैं, तो आप अपने प्रदर्शन को और भी अधिक बढ़ा देंगे।

केवल स्थितियों जब आप दोहरे उद्धरण चिह्नों का उपयोग करना चाहिए, जब आप की जरूरत है \r, \n, \t! ओवरहेड सिर्फ किसी अन्य मामले में इसका उपयोग करने के लिए इसके लायक नहीं है।

चीजों को करने के अलग-अलग तरीकों पर कुछ बेंचमार्क के लिए आपको पीएचपी वैरिएबल कॉन्टेक्टेशन , phpbench.com की भी जांच करनी चाहिए ।


19
-1: एकल उद्धरणों का उपयोग करने से प्रदर्शन पर कोई वास्तविक प्रभाव नहीं पड़ता है। लिंक्ड पेज माइक्रोसेकंड में दो तरीकों के बीच अंतर दिखाता है , जो कि 0.000001 सेकंड है। किसी भी डेटाबेस की क्वेरी उस समय सैकड़ों बार लेने वाली है। यह बहस पूरी तरह से निरर्थक है।
पेका

उल्लेख के लिए अच्छा बिंदु \r, \nऔर \tअन्य उत्तरों के रूप में यह बिट शामिल नहीं था।
badReiko

2

यह केवल स्वाद की बात है।
जो चाहो प्रयोग करो।

ज्यादातर समय मैं दूसरे का उपयोग कर रहा हूं, लेकिन यह निर्भर करता है।

मेरा सुझाव है कि आप भी अपने आप को एक अच्छा संपादक पाने के लिए एक स्ट्रिंग के अंदर एक चर पर प्रकाश डाला जाएगा


Ive को textarea की जरूरत है। PSPad चट्टानों।
Web_Designer 15

2

संघात मत करो। इसकी आवश्यकता नहीं है, हम कई तरह के मापदंडों को ग्रहण कर सकते हैं

echo "Welcome ", $name, "!";

एकल या दोहरे उद्धरणों का उपयोग करने के बारे में, अंतर नगण्य है, आप अपने लिए परीक्षण करने के लिए बड़ी संख्या में तार के साथ परीक्षण कर सकते हैं।


6
यद्यपि यह केवल प्रतिध्वनि पर लागू होता है। एक चर असाइनमेंट के लिए इसे आज़माएं और अपने कोड को ब्लो अप देखें।
मार्क बी

1

आपको पहले वाला चुनना चाहिए। उनके पास प्रदर्शन के अलावा कोई अंतर नहीं है, दूसरे की तुलना में पहला तेज होगा।

यदि दोहरे उद्धरण चिह्नों के अंदर परिवर्तनशील चर को पार्स करने में समय लगता है।

चर अवतरण के लिए इस एकल उद्धरण या दोहरे उद्धरण की जाँच करें ?

यह एक और उदाहरण है क्या php में एक प्रदर्शन लाभ एकल उद्धरण बनाम दोहरे उद्धरण है?

मुझे समझ नहीं आया कि ऊपर दिए गए लिंक में यह उत्तर क्यों दिया गया और यह उत्तर नीचे क्यों मिला।

जैसा कि मैंने वही कहा।

आप यहां भी देख सकते हैं

PHP, सिंगल या डबल कोट्स में क्या तेज़ी है?


5
-1 समयपूर्व अनुकूलन के लिए। प्रदर्शन में अंतर एक कारक होने के लिए पर्याप्त नहीं है जब तक कि आप एक स्क्रिप्ट में लाखों बार प्रिंट नहीं कर रहे हैं - और फिर भी, आपके द्वारा किए जाने वाले किसी भी अन्य प्रसंस्करण के सेकंड के अतिरिक्त जोड़े को आप अलग-अलग प्रिंट करने में खर्च करेंगे। । उनके बीच प्रमुख अंतर पठनीयता है (जो मुझे दूसरी शैली पसंद करने के लिए प्रेरित करता है)।
cHao

1
मैं आपके आखिरी सवाल का जवाब देने की कोशिश कर सकता हूं। PHP समुदाय में कई जंगली अफवाहें हैं और उनमें से कुछ बहुत मजबूत हैं। उनका खुलासा करना और समय लेना बहुत संघर्ष है। लेकिन धीरे-धीरे यह बदल रहा है। इसलिए, आपके द्वारा जोड़ा गया उत्तर पुराना है, उस समय से जब लोगों को परवाह नहीं थी। जबकि इसमें कुछ लोगों ने अपने स्वयं के अनुभव के आधार पर उत्तर दिया, न कि उनके द्वारा पढ़े गए किसी लेख पर।
आपका कॉमन सेंस

प्रदर्शन का नुकसान झूठा +1 @cHao है। यहाँ यह साबित करने वाले मैट्रिक्स के साथ एक लेख है। nikic.github.io/2012/01/09/…
डेमियन

1

यदि आप एक SQLकमांड निष्पादित करना चाहते हैं और आपके चर सरणी के सदस्य हैं, तो आपको []सरणी के अंदर एकल उद्धरण का उपयोग नहीं करना चाहिए (जैसे कि:) ['']; उदाहरण के लिए यदि आप इस स्ट्रिंग को SQL कमांड के रूप में उपयोग करते हैं, तो आपको यह मिलता है server error 500:

$con = mysqli_connect('ServerName', 'dbUsername', 'dbPassword');
mysqli_select_db($con, 'dbName')

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray['TraceNo']')";
mysqli_query($con, $sql)

सही स्ट्रिंग है:

//'ID' is auto increment field.
$sql = "INSERT INTO sampleTable (ID, TraceNo) VALUES ('','$sampleArray[TraceNo]')";

आपको इसके बजाय पीडीओ का उपयोग करना चाहिए
s3c

0

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि किसी को सभी पेशेवरों और विपक्षों का उल्लेख करना होगा:

बेहतर सिंटेक्स : यह व्यक्तिगत प्राथमिकता है।

प्रदर्शन : कोई अंतर नहीं। जैसा कि कई उल्लेख किया गया है, यदि अनुचित रूप से कई चर का उपयोग करते हुए डबल-उद्धरण तेज हो सकता है।

बेहतर उपयोग : एकल उद्धरण (अधिकतर)। जैसा कि @Kzz ने कहा, एकल उद्धरण के साथ आप कुछ भी सम्‍मिलित कर सकते हैं, यहां तक ​​कि फ़ंक्शन कॉल और चर संशोधन, जैसे echo 'hi ' . trim($name) . ($i + 1);:। केवल एक चीज दोहरे-उद्धरण है कि एकल बोली नहीं कर सकते के उपयोग का पता लगा सकते \n, \r, \tऔर एक जैसे।

पठनीयता : कोई अंतर नहीं (व्यक्तिगत प्राथमिकता लागू हो सकती है)।

रिटिटिबिलिटी / री-राइटिबिलिटी / डिबगिंग : 1-लाइन स्टेटमेंट में कोई अंतर नहीं होता है, लेकिन कई लाइनों के साथ काम करते समय डिबगिंग या राइटिंग करते समय लाइनों को कमेंट / अनफॉलो करना आसान होता है। उदाहरण के लिए:

$q = 'SELECT ' .
     't1.col1 ' .
     ',t2.col2 ' .
   //',t3.col3 ' .
     'FROM tbl1 AS t1 ' .
     'LEFT JOIN tbl2 AS t2 ON t2.col2 = t1.col1 ' .
   //'LEFT JOIN tbl3 AS t3 ON t3.col3 = t2.col2 ' .
     'WHERE t1.col1 = ' . $x . ' ' .
     '  AND t2.col2 = ' . $y . ' ' .
   //'  AND t3.col3 = ' . $z . ' ' .
     'ORDER BY t1.col1 ASC ' .
     'LIMIT 10';

कम बचना : एकल-उद्धरण। एकल उद्धरण के लिए आपको केवल ( 'और \) 2 वर्णों से बचने की आवश्यकता है । दोहरे उद्धरण के लिए आप 2 वर्ण (से बचने के लिए की जरूरत है ", \) और 3 अधिक यदि आवश्यक ( $, {और })।

कम परिवर्तन : एकल उद्धरण। उदाहरण के लिए यदि आपके पास निम्नलिखित कोड है:

echo 'Number ' . $i . '!';

और आपको 1 से $ i वेतन वृद्धि की आवश्यकता है, इसलिए यह पसंद बनता है:

echo 'Number ' . ($i + 1) . '!';

लेकिन दोहरे उद्धरण चिह्नों के लिए, आपको इसे बदलना होगा:

echo "Number $i!";

इसके लिए:

echo "Number " . ($i + 1) . "!";

निष्कर्ष : जो आप पसंद करते हैं उसका उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.