ความแตกต่างระหว่างสตริงที่ยกมาเดี่ยวและดับเบิลอ้างถึงใน PHP คืออะไร?


796

ฉันสับสนเล็กน้อยว่าทำไมฉันเห็นบางโค้ดใน PHP โดยมีสตริงอยู่ในเครื่องหมายคำพูดเดี่ยวและบางครั้งก็เป็นเครื่องหมายคำพูดคู่

ฉันเพิ่งรู้ใน. NET หรือภาษา C หากอยู่ในเครื่องหมายคำพูดเดียวนั่นหมายความว่ามันเป็นตัวละครไม่ใช่สตริง

คำตอบ:


1086

สตริง PHPสามารถระบุได้ไม่เพียง แต่ในสองวิธี แต่ในสี่วิธี

  1. สตริงที่ยกมาเดี่ยวจะแสดงสิ่งที่เกือบ "สมบูรณ์" ตัวแปรและลำดับการยกเว้นส่วนใหญ่จะไม่ถูกตีความ ยกเว้นว่าจะแสดงคำพูดเดียวที่แท้จริงคุณสามารถหลบหนีด้วยการเฉือนกลับ\'และเพื่อแสดงเฉือนกลับมาคุณจะสามารถหนีมันด้วย backslash อื่น\\(ดังนั้นใช่สตริงที่ยกมาแม้เพียงครั้งเดียวมีการแยกวิเคราะห์ )
  2. สตริงอัญประกาศคู่จะแสดงโฮสต์ของอักขระที่ใช้ Escape (รวมถึงบาง regexes) และตัวแปรในสตริงจะถูกประเมิน จุดสำคัญที่นี่เป็นที่ที่คุณสามารถใช้วงเล็บปีกกาเพื่อแยกชื่อของตัวแปรที่คุณต้องการประเมิน ตัวอย่างเช่นสมมติว่าคุณมีตัวแปรและคุณต้องการ$type ที่จะมองหาตัวแปรecho "The $types are" $typesเพื่อหลีกเลี่ยงการใช้งานนี้echo "The {$type}s are"คุณสามารถใส่เครื่องหมายวงเล็บปีกกาซ้ายก่อนหรือหลังเครื่องหมายดอลลาร์ ดูที่การแยกวิเคราะห์สตริงเพื่อดูวิธีการใช้ตัวแปรอาเรย์และอื่น ๆ
  3. ไวยากรณ์สตริง Heredocทำงานเหมือนสตริงที่ยกมาสองครั้ง <<<มันเริ่มต้นด้วย หลังจากโอเปอเรเตอร์นี้จะมีการระบุรหัสจากนั้นขึ้นบรรทัดใหม่ สายอักขระดังต่อไปนี้แล้วตัวระบุเดียวกันอีกครั้งเพื่อปิดใบเสนอราคา คุณไม่จำเป็นต้องหลีกเลี่ยงคำพูดในรูปแบบนี้
  4. Nowdoc (ตั้งแต่ PHP 5.3.0) ไวยากรณ์สตริงทำงานเป็นหลักเหมือนกับสตริงที่ยกมาเดี่ยว ความแตกต่างคือต้องไม่เว้นแม้แต่เครื่องหมายคำพูดเดี่ยวหรือแบ็กสแลช nowdoc จะถูกระบุด้วยเหมือนกัน<<<ลำดับที่ใช้สำหรับ heredocs <<<'EOT'แต่ระบุซึ่งต่อไปนี้จะถูกล้อมรอบในราคาเดียวเช่น ไม่มีการแยกวิเคราะห์ใน nowdoc

หมายเหตุ: เครื่องหมายคำพูดเดี่ยวภายในเครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่ภายในเครื่องหมายคำพูดคู่จะต้องหลีกเลี่ยง:

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

ความเร็ว:
ฉันจะไม่ใส่น้ำหนักมากเกินไปสำหรับการเสนอราคาเดียวที่เร็วกว่าการเสนอราคาสองเท่า พวกเขาอาจเร็วกว่าในบางสถานการณ์ ต่อไปนี้เป็นบทความที่อธิบายวิธีการหนึ่งที่การเสนอราคาแบบเดี่ยวและคู่มีความรวดเร็วพอ ๆ กันตั้งแต่ PHP 4.3 ( Useless Optimizationsไปทางด้านล่างส่วนC) นอกจากนี้หน้าเบนช์มาร์กนี้มีการเปรียบเทียบเปรียบเทียบกับการเสนอราคาสองครั้งเดี่ยว การเปรียบเทียบส่วนใหญ่เหมือนกัน มีการเปรียบเทียบหนึ่งที่ราคาสองครั้งจะช้ากว่าราคาเดียว


17
+1 สำหรับเคล็ดลับรั้งลอน ไม่ทราบว่า ${variablename}น่าเสียดายที่มันไม่เป็นไปตามอนุสัญญาเดียวกับเชลล์สคริปต์คือ
devios1

6
ฉันจะใช้เครื่องหมายคำพูดคู่เท่านั้นเมื่อฉันต้องการมัน\nสิ่งอื่นใดในPHPรหัสของฉันอยู่ในเครื่องหมายคำพูดเดี่ยว
Jo Smo

ดูเหมือนว่า 'heredoc' ถูกย้ายไปยัง PHP จาก bash หรือไม่ อย่างไรก็ตามคำตอบที่ดีดังนั้นจึงขอขอบคุณ +1
sjsam

2
หมายเหตุที่น่าสนใจในข้อคิดเห็นเกี่ยวกับเอกสาร PHP: php.net/manual/en/language.types.string.php#120160 - "สตริงที่มีเครื่องหมายคำพูดคู่" ซึ่งดูช้ามากเนื่องจากพวกเขาต้องแยกวิเคราะห์ \ backslashes และ $ ดอลลาร์ สัญญาณที่จะทำการขยายตัวตัวแปร "กลายเป็นวิธีการเชื่อมต่อสตริงที่เร็วที่สุดใน PHP - ระยะเวลา! คำพูดเดียวจะเร็วขึ้นหากสตริงของคุณเป็นตัวอักษรที่สมบูรณ์ (ไม่มีอะไรที่จะแยกวิเคราะห์ในมันและไม่มีอะไรจะต่อกัน) เล็กมากและไม่สำคัญ "
dregad

1
หมายเหตุ: ความเชื่องช้าของ"เครื่องหมายคำพูดคู่นั้นเป็นเพียงเรื่องในอดีต การอัปเดตได้เพิ่มการประมวลผลคำพูดสองเท่าให้เร็วขึ้นในทุกวันนี้
SherylHohman

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
คำพูดเดียวที่หลบหนีและเครื่องหมายแบ็กสแลชที่หนีออกมาจะถูกขยายออกแม้ในสตริงที่ยกมาเดี่ยว
Peter Ajtai

43
ข้อผิดพลาดที่นักพัฒนาซอฟต์แวร์ใหม่ของ PHP กำลังทำงานอยู่: $mailbody = 'I want a line break:\nDone.';กำลังรักษาความ\nมีชีวิต โดยที่: $mailbody = "I want a line break:\nDone.";จะแยกตัวแบ่งบรรทัด
Kai Noack

สองเซ็นต์ของฉันจำเป็นสำหรับการสัมภาษณ์หรือการพัฒนามัลแวร์เท่านั้น เพียงเปรียบเทียบ 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ถูกแปลงเป็นสตริงด้วยตัวอักษรจริง
Rostyslav Pylypenko

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 เอกสารบนสตริง
SherylHohman

ฉันเห็นคำตอบทั้งหมดที่: คุณสามารถใช้ชื่อตัวแปรภายในเครื่องหมายคำพูดคู่เพื่อพิมพ์ค่าของตัวแปร แต่คุณกำลังพูดชื่อตัวแปรควรอยู่ในวงเล็บปีกกาเพื่อหลีกเลี่ยงความจำเป็นในการใช้การเรียงต่อกัน ระยะเวลา ดังนั้นหากทั้ง "$ my_var" และ "{$ my_var}" ส่งออกค่าของ $ my_var แล้ววงเล็บปีกกาจะทำอะไร? ขอบคุณ!
Bahman.A

40

สตริงที่ยกมาเดี่ยวไม่มีตัวแปรภายในมันตีความ สตริงที่มีเครื่องหมายคำพูดคู่ทำ

นอกจากนี้สตริงที่มีเครื่องหมายคำพูดคู่สามารถมีเครื่องหมายอัญประกาศเดี่ยวโดยไม่มีเครื่องหมายแบ็กสแลชในขณะที่สตริงเครื่องหมายคำพูดเดี่ยวสามารถมีเครื่องหมายคำพูดที่ไม่ใช้ค่า Escape

สตริงที่อ้างถึงเดี่ยวเร็วกว่าขณะรันไทม์เนื่องจากไม่จำเป็นต้องแยกวิเคราะห์


8
สตริงที่ยกมาเดี่ยวยังใช้หน่วยความจำน้อย วิธีที่เร็วที่สุดในการจัดการสตริงใน PHP คือการใช้เครื่องหมายคำพูดเดี่ยวและการใช้ โอเปอเรเตอร์เพื่อเชื่อมสตริงและตัวแปรต่าง ๆ
RibaldEddie

อืมถูกต้องฉันถ้าฉันผิด แต่ภาษาฐานสำหรับ PHP คือ C ใช่มั้ย แล้วเหตุใดการอ้างอิงสตริงจึงแตกต่างกันใน PHP และ C
ปล้น waminal

1
@rob waminal: อาจใช้งาน PHP ใน C แต่เป็นภาษาอื่น ภาษา PHP ระบุความหมายเหล่านี้
Borealid

@Ribald - ขณะนี้ไม่ได้เป็นไวยากรณ์เร็วขึ้นหรือไม่ สตริงที่ยกมาเดี่ยวจะถูกแยกวิเคราะห์สำหรับคำพูดเดียวที่หลบหนีและแบ็กสแลช
ปีเตอร์ Ajtai

@ ปีเตอร์คุณอาจถูกต้องฉันไม่เคยใส่ใจที่จะขุดมัน เอกสาร PHP ทำให้การเรียกร้องความเร็วฉันตัดสินใจที่จะเชื่อว่าเอกสารเกี่ยวกับความเชื่อ :)
RibaldEddie

27

ใน PHP ทั้ง'my name'และ"my name"เป็นสตริง คุณสามารถอ่านเพิ่มเติมได้ที่คู่มือของ PHP

สิ่งที่คุณควรรู้คือ

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

ใน PHP คนใช้คำพูดเดียวที่จะกำหนดสตริงคงที่เช่น'a', 'my name', ในขณะที่ใช้คำพูดสองครั้งเพื่อกำหนดสตริงประกอบด้วยตัวระบุเช่น'abc xyz'"a $b $c $d"

และอีกอย่างคือ

echo 'my name';

เร็วกว่า

echo "my name";

แต่

echo 'my ' . $a;

ช้ากว่า

echo "my $a";

นี่เป็นความจริงสำหรับการใช้งานสตริงอื่น ๆ


18

ตัวอย่างของเครื่องหมายอัญประกาศเดี่ยว, heredoc และ nowdoc

<?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

ที่นี่ double quote แจงค่าและ single quote ถือว่าเป็นค่าสตริง (โดยไม่ต้องวิเคราะห์$testตัวแปร)


12

อักขระที่ล้อมรอบทั้งสองชนิดเป็นสตริง การเสนอราคาประเภทหนึ่งใช้เพื่อสะดวกในการปิดการเสนอราคาประเภทอื่น และ"'" '"'ความแตกต่างที่ใหญ่ที่สุดระหว่างประเภทของอัญประกาศคือการอ้างอิงตัวระบุที่ล้อมรอบจะถูกแทนที่ภายในเครื่องหมายคำพูดคู่ แต่ไม่อยู่ในเครื่องหมายคำพูดเดี่ยว


3

ความแตกต่างระหว่างการใช้เครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่ใน php คือถ้าเราใช้เครื่องหมายคำพูดเดี่ยวในคำสั่ง echo จะถือว่าเป็นสตริง ... แต่ถ้าเราใส่ชื่อตัวแปรภายในเครื่องหมายคำพูดคู่มันจะส่งออกค่าของตัวแปรนั้นพร้อมกับสตริง



-1

สิ่งหนึ่ง:

มันเป็นสิ่งสำคัญมากที่จะทราบว่าสอดคล้องกับตัวบ่งชี้ปิดHeredocต้องไม่มีส่วนผสมของตัวละครอื่น ๆ ยกเว้นเซมิโคลอน (;) ซึ่งหมายความว่าโดยเฉพาะอย่างยิ่งที่ตัวระบุอาจไม่เยื้องและอาจไม่มีช่องว่างหรือแท็บใด ๆก่อนหรือหลังเครื่องหมายอัฒภาค

ตัวอย่าง:

   $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.');

หากคุณคุ้นเคยกับการใช้เครื่องหมายอัญประกาศภาษาอังกฤษและอักขระที่ถูกต้องสำหรับเครื่องหมายอัญประกาศเดี่ยวคุณสามารถใช้เครื่องหมายอัญประกาศคู่หรือเดี่ยวได้เพราะจะไม่สำคัญอีกต่อไป:
alert("It’s “game” time.");และalert('It’s “game” time.');

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.