PHP में एकल-उद्धृत और दोहरे-उद्धृत स्ट्रिंग्स के बीच अंतर क्या है?


796

मैं थोड़ा उलझन में हूं कि मुझे PHP में कुछ कोड एकल उद्धरणों में और कभी-कभी दोहरे उद्धरणों में क्यों दिखाई देते हैं।

मैं सिर्फ .NET, या सी भाषा में जानता हूं, अगर यह एक ही उद्धरण में है, तो इसका मतलब है कि यह एक चरित्र है, न कि एक स्ट्रिंग।

जवाबों:


1086

PHP स्ट्रिंग्स को न केवल दो तरीकों से, बल्कि चार तरीकों सेनिर्दिष्ट किया जा सकताहै।

  1. एकल उद्धृत स्ट्रिंग्स लगभग पूरी तरह से "जैसा है" चीजों को प्रदर्शित करेगा। चर और सबसे अधिक भागने वाले दृश्यों की व्याख्या नहीं की जाएगी। अपवाद यह है कि शाब्दिक एकल उद्धरण को प्रदर्शित करने के लिए, आप इसे बैक स्लैश के साथ छोड़ सकते हैं\', औरबैक स्लैशको प्रदर्शित करने के लिए, आप इसे किसी अन्य बैकस्लैश के साथ बच सकते हैं\\( तो हाँ, यहां तक ​​कि एकल उद्धृत स्ट्रिंग्स पार्स किए जाते हैं )।
  2. डबल कोट स्ट्रिंग्स बच गए पात्रों (कुछ रीगेक्स सहित) का एक मेजबान प्रदर्शित करेगा, और स्ट्रिंग्स में चर का मूल्यांकन किया जाएगा। यहां एक महत्वपूर्ण बिंदु यह है कि आप जिस चर का मूल्यांकन करना चाहते हैं उसका नाम अलग करने के लिए आप घुंघराले ब्रेसिज़ का उपयोग कर सकते हैं । उदाहरण के लिए मान लें कि आपके पास चर है$typeऔर आप चाहते हैंecho "The $types are"। कि चर के लिए दिखेगा$types। इस उपयोग के आस-पास जाने के लिएecho "The {$type}s are"आप डॉलर के संकेत से पहले या बाद में बाईं ओर ब्रेस लगा सकते हैं। सरणी चर और इस तरह का उपयोग करने के तरीके को देखने के लिए स्ट्रिंग पार्सिंग पर एक नज़र डालें।
  3. Heredoc स्ट्रिंग सिंटैक्स डबल उद्धृत स्ट्रिंग्स की तरह काम करता है। इसके साथ शुरू होता है<<<। इस ऑपरेटर के बाद, एक पहचानकर्ता प्रदान किया जाता है, फिर एक नई रेखा। स्ट्रिंग स्वयं अनुसरण करता है, और फिर उद्धरण को बंद करने के लिए फिर से वही पहचानकर्ता। आपको इस सिंटैक्स में उद्धरण से बचने की आवश्यकता नहीं है।
  4. Nowdoc (PHP 5.3.0 के बाद से) स्ट्रिंग सिंटैक्स अनिवार्य रूप से एकल उद्धृत स्ट्रिंग्स की तरह काम करता है। अंतर यह है कि एकल उद्धरण या बैकस्लैश को भी नहीं बचाना है। एक नॉडरॉक की पहचान उसी<<<क्रम से की जाती है जिसका उपयोग हेरेडोक्स के लिए किया जाता है, लेकिन जो पहचानकर्ता निम्न है, वह एकल उद्धरणों में संलग्न है, जैसे<<<'EOT'नोर्डोक में कोई पार्सिंग नहीं की जाती है।

नोट: सिंगल कोट्स के अंदर सिंगल कोट्स और डबल कोट्स के अंदर डबल कोट्स से बच जाना चाहिए:

$string = 'He said "What\'s up?"';
$string = "He said \"What's up?\"";

गति:
मैं दोहरे उद्धरणों की तुलना में तेज़ उद्धरणों पर बहुत अधिक भार नहीं डालूँगा। वे शायद कुछ स्थितियों में तेज हैं। यहां एक लेख समझा जा रहा है जिसमें PHP 4.3 ( Useless Optimizationsनीचे, अनुभाग C) के बाद से एकल और दोहरे उद्धरण अनिवार्य रूप से समान रूप से तेज़ हैं । इसके अलावा, इस बेंचमार्क पृष्ठ में एकल बनाम दोहरी उद्धरण तुलना है। अधिकांश तुलनाएं समान हैं। एक तुलना है जहाँ सिंगल कोट्स की तुलना में डबल कोट्स धीमी हैं।


17
कर्ली ब्रेस ट्रिक के लिए +1। उस के बारे में पता नहीं था। बहुत बुरा यह शेल स्क्रिप्ट के रूप में एक ही सम्मेलनों का पालन नहीं करता है, यानी ${variablename}
डेविस १

6
मैं केवल दोहरे उद्धरण चिह्नों का उपयोग करता हूं, जब मुझे इसकी आवश्यकता होती है, तो \nमेरे PHPकोड में कुछ भी एकल उद्धरण में होता है।
जो स्मो

लगता है 'हेरेडोक' बैश से PHP में पोर्ट किया गया है या नहीं? वैसे भी महान जवाब, तो एक +1 धन्यवाद।
sjsam

2
PHP प्रलेखन टिप्पणियों में दिलचस्प नोट: php.net/manual/en/language.types.string.php#120160 - "दोहरे उद्धरण वाले तार" जो इतने धीमे लगते हैं क्योंकि उन्हें अपने बैकस्लैश और $ डॉलर के लिए सब कुछ पार्स करना पड़ता है चर विस्तार करने के लिए संकेत ", PHP में सबसे तेज स्ट्रिंग संघनन विधि निकला - PERIOD - एकल-उद्धरण केवल तभी तेज होते हैं यदि आपका स्ट्रिंग पूरी तरह से शाब्दिक है (इसमें कुछ भी नहीं करने के लिए और कुछ करने के लिए कुछ भी नहीं है), लेकिन मार्जिन है बहुत छोटा और कोई फर्क नहीं पड़ता। "
dregad

1
नोट: "डबल कोट्स की सुस्ती सभी लेकिन अतीत की बात है। अपडेट्स ने इन दिनों सभी, लेकिन चरम मामलों में, दोहरे उद्धरण चिह्नों के प्रसंस्करण में तेजी से वृद्धि की है।
शेरलहोमन

211

चीजों का मूल्यांकन दोहरे उद्धरण चिह्नों में किया जाता है लेकिन एकल में नहीं:

$s = "dollars";
echo 'This costs a lot of $s.'; // This costs a lot of $s.
echo "This costs a lot of $s."; // This costs a lot of dollars.

1
बच गए सिंगल कोट्स और बच गए बैकस्लैश का विस्तार सिंगल कोटेड स्ट्रिंग्स में भी किया जाता है।
पीटर अजताई

43
एक गलती है कि कई पीएचपी करने के लिए नए डेवलपर्स में चल रहे हैं: $mailbody = 'I want a line break:\nDone.';ध्यान में रखते हुए किया गया है \nजिंदा। जबकि: $mailbody = "I want a line break:\nDone.";लाइन ब्रेक को पार्स करेगा।
काई नोएक

मेरे दो सेंट केवल साक्षात्कार के लिए या मैलवेयर विकास के लिए आवश्यक हैं। बस दो भावों से var_dump () की तुलना करें: $testWithAsciiAndUtf8Characters = "\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!"; $simpleTest = '\x48\x41\x4c\114\117 \u{0147}\u{012B}\u{0144}\u{014D}!'; चरित्र अनुक्रम $testWithAsciiAndUtf8Charactersवास्तविक अक्षरों के साथ स्ट्रिंग में बदल गए थे।
रोस्टीस्लाव पाइलपेंको

56

' एकल उद्धृत

एक स्ट्रिंग को निर्दिष्ट करने का सबसे सरल तरीका यह है कि इसे एकल उद्धरण में संलग्न किया जाए। एकल उद्धरण आम तौर पर तेज है, और अंदर उद्धृत सब कुछ सादे स्ट्रिंग के रूप में माना जाता है।

उदाहरण:

echo 'Start with a simple string';
echo 'String\'s apostrophe';
echo 'String with a php variable'.$name;

" डबल उद्धृत किया गया

पीरियड को अलग कोड करने के लिए उपयोग करने से बचने के लिए PHP में दोहरे उद्धरण चिह्नों का उपयोग करें (नोट: {}यदि आप .स्ट्रिंग में कॉन्टेक्टेशन ( ) ऑपरेटर) का उपयोग नहीं करना चाहते हैं तो चर को शामिल करने के लिए घुंघराले ब्रेसिज़ का उपयोग करें ।

उदाहरण:

echo "Start with a simple string";
echo "String's apostrophe";
echo "String with a php variable {$name}";

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

हाँ। एकल उद्धरणों का उपयोग करना थोड़ा तेज़ है।

PHP एकल उद्धरण के अंदर क्या है इसकी व्याख्या करने के लिए अतिरिक्त प्रसंस्करण का उपयोग नहीं करेगा। जब आप दोहरे उद्धरण चिह्नों का उपयोग करते हैं, तो यह देखने के लिए कि क्या स्ट्रिंग के भीतर कोई चर हैं, PHP को पार्स करना होगा।


एक एकल उद्धरण नहीं स्ट्रिंग के भीतर कुछ भी पार्स करने के लिए अपवाद है, क्या आप का उपयोग कर सकते है \'स्ट्रिंग के भीतर उपयोग के लिए एक एकल apostrophe से बचने के लिए (या \\'बैकस्लैश प्रदर्शित करने के लिए)। ध्यान दें कि पारंपरिक एस्केप सीक्वेंस, जैसे \nकि न्यूलाइन वर्ण में पार्स नहीं किया जाएगा। PHP डॉक्स स्ट्रिंग्स पर
शेरिलहोमन

मैं उन सभी उत्तरों को देखता हूं जो: आप चर के मूल्य को प्रिंट करने के लिए चर के नाम का उपयोग दोहरे उद्धरण के अंदर कर सकते हैं, लेकिन आप कह रहे हैं, चर नाम का घुंघराले ब्रेसिज़ के भीतर भी संक्षिप्त नाम का उपयोग करने से बचने के लिए संलग्न होना चाहिए। अवधि। तो अगर दोनों "$ my_var" और "{$ my_var}" आउटपुट $ my_var के मूल्य हैं, तो इसके लिए ब्रेसिज़ क्या हैं? धन्यवाद!
बहमन.एक

40

एक एकल-उद्धृत स्ट्रिंग में व्याख्या किए गए के भीतर चर नहीं हैं। एक डबल-उद्धृत स्ट्रिंग करता है।

इसके अलावा, एक डबल-कोटेड स्ट्रिंग में बैकस्टलैश के बिना एपॉस्ट्रॉफ़ हो सकते हैं, जबकि एकल-उद्धृत स्ट्रिंग में बिना उद्धरण वाले चिह्न हो सकते हैं।

एकल-उद्धृत स्ट्रिंग्स तेजी से रनटाइम पर होते हैं क्योंकि उन्हें पार्स करने की आवश्यकता नहीं होती है।


8
एकल उद्धृत स्ट्रिंग्स भी कम मेमोरी का उपयोग करते हैं। PHP में स्ट्रिंग्स को संभालने का सबसे तेज़ तरीका एकल उद्धरणों और उपयोग के साथ है। ऑपरेटर स्ट्रिंग्स और वेरिएबल्स को समाप्‍त करने के लिए।
RibaldEddie

हम्म, मुझे सही करें अगर मैं गलत हूं लेकिन PHP के लिए आधार भाषा सी सही है? फिर स्ट्रिंग उद्धरण PHP और C में भिन्न क्यों हैं?
लूट waminal

1
@rob वैमाइनल: PHP को C में लागू किया जा सकता है, लेकिन यह एक अलग भाषा है। PHP भाषा इन शब्दार्थों को निर्दिष्ट करती है।
बोरेलिड

@Ribald - क्या अब सिंटेक्स सिंटैक्स तेज नहीं होगा? एकल उद्धृत स्ट्रिंग बची हुई एकल उद्धरण और बैकस्लैश के लिए पार्स की जाती हैं।
पीटर अज़ताई

@ पेटर, आप सही हो सकते हैं, मैंने वास्तव में इसे खोदने की जहमत नहीं उठाई है। PHP प्रलेखन गति का दावा करता है, मैंने विश्वास पर डॉक्स पर विश्वास करने का फैसला किया। :)
रिबल्डएड्डी

27

PHP में, दोनों 'my name'और "my name"स्ट्रिंग हैं। आप PHP मैनुअल में इसके बारे में अधिक पढ़ सकते हैं ।

बात आपको पता होनी चाहिए

$a = 'name';
$b = "my $a"; == 'my name'
$c = 'my $a'; != 'my name'

पीएचपी में, लोगों को एक निरंतर स्ट्रिंग परिभाषित करने के लिए एकल उद्धरण का उपयोग करें, जैसे 'a', 'my name', 'abc xyz', दोहरे उद्धरण का उपयोग करते समय एक स्ट्रिंग को परिभाषित करने के पहचानकर्ता की तरह होते हैं "a $b $c $d"

और दूसरी बात यह है कि,

echo 'my name';

से तेज है

echo "my name";

परंतु

echo 'my ' . $a;

से धीमी है

echo "my $a";

यह स्ट्रिंग के अन्य उपयोग के लिए सही है।


18

सिंगल, डबल, हेरेडोक और नॉडॉक कोट्स का उदाहरण

<?php

    $fname = "David";

    // Single quotes
    echo 'My name is $fname.'; // My name is $fname.

    // Double quotes
    echo "My name is $fname."; // My name is David.

    // Curly braces to isolate the name of the variable
    echo "My name is {$fname}."; // My name is David.

    // Example of heredoc
    echo $foo = <<<abc
    My name is {$fname}
    abc;

        // Example of nowdoc
        echo <<< 'abc'
        My name is "$name".
        Now, I am printing some
    abc;

?>

16

PHP में, एकल उद्धरण पाठ को स्ट्रिंग मान के रूप में माना जाता है और दोहरा उद्धरण पाठ उनके मूल्य को बदलने और संसाधित करके चर को पार करेगा।

$test = "variable";
echo "Hello Mr $test"; // the output would be: Hello Mr variable
echo 'Hello Mr $test'; // the output would be: Hello Mr $test

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


12

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


3

Php में सिंगल कोट्स और डबल कोट्स का उपयोग करने के बीच का अंतर यह है कि यदि हम इको स्टेटमेंट में सिंगल कोट्स का उपयोग करते हैं तो इसे एक स्ट्रिंग के रूप में माना जाता है। ... लेकिन अगर हम दोहरे उद्धरण चिह्नों के भीतर चर नाम दर्ज करते हैं तो यह स्ट्रिंग के साथ-साथ उस चर के मूल्य को भी आउटपुट करेगा।


0

यहां वैरिएबल के साथ सिंगल और डबल कोट्स की कुछ संभावनाएं हैं

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';

-1

एक बात:

यह ध्यान रखना बहुत महत्वपूर्ण है कि हेरेडोक के समापन पहचानकर्ता के साथ लाइन में कोई अन्य वर्ण नहीं होना चाहिए , सिवायमोलोन (;) को छोड़कर । इसका मतलब है कि विशेष रूप से यह है कि पहचानकर्ता को इंडेंट नहीं किया जा सकता है , और अर्धविराम से पहले या बाद में कोई स्थान या टैब नहीं हो सकता है ।

उदाहरण:

   $str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

1
यह एक सच्चा बयान है, लेकिन यहां सवाल से कोई लेना-देना नहीं है।
miken32

-1

हो सकता है कि मैं थोड़ा लेट हो गया हूँ, और थोड़ा ऑफ-टॉपिक, लेकिन यहाँ वैसे भी है:

जरूरी नहीं कि आपको अपनी स्ट्रिंग सामग्री के बीच चयन करना हो:
alert("It's \"game\" time.");याalert('It\'s "game" time.');

आप अंग्रेजी उद्धरण चिह्न के उपयोग, और apostrophe के लिए सही चरित्र से परिचित हैं, तो आप या तो डबल या एकल उद्धरण चिह्नों का उपयोग कर सकते हैं, क्योंकि यह नहीं होगा मामला अब और:
alert("It’s “game” time.");औरalert('It’s “game” time.');

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