Sự khác biệt giữa các chuỗi trích dẫn đơn và trích dẫn kép trong PHP là gì?


796

Tôi hơi bối rối tại sao tôi thấy một số mã trong PHP với chuỗi được đặt trong dấu ngoặc đơn và đôi khi trong dấu ngoặc kép.

Tôi chỉ biết bằng .NET, hoặc ngôn ngữ C, nếu nó nằm trong một trích dẫn, điều đó có nghĩa là nó là một ký tự, không phải là một chuỗi.

Câu trả lời:


1086

Các chuỗi PHP có thể được chỉ định không chỉ theo hai cách, mà theo bốn cách.

  1. Các chuỗi trích dẫn đơn sẽ hiển thị mọi thứ gần như hoàn toàn "như vậy." Các biến và hầu hết các chuỗi thoát sẽ không được giải thích. Một ngoại lệ là để hiển thị một trích dẫn theo nghĩa đen, bạn có thể thoát nó bằng dấu gạch chéo ngược\'và để hiển thị dấu gạch chéo ngược, bạn có thể thoát nó bằng dấu gạch chéo ngược khác\\( Vì vậy, ngay cả các chuỗi trích dẫn đơn cũng được phân tích cú pháp ).
  2. Chuỗi trích dẫn kép sẽ hiển thị một loạt các ký tự thoát (bao gồm một số biểu thức chính) và các biến trong chuỗi sẽ được đánh giá. Một điểm quan trọng ở đây là bạn có thể sử dụng dấu ngoặc nhọn để tách tên của biến bạn muốn đánh giá . Ví dụ: giả sử bạn có biến$typevà bạn muốnecho "The $types are". Điều đó sẽ tìm kiếm các biến$types. Để giải quyết vấn đề này,echo "The {$type}s are"bạn có thể đặt nẹp trái trước hoặc sau ký hiệu đô la. Hãy xem phân tích chuỗi để xem cách sử dụng các biến mảng và như vậy.
  3. Cú pháp chuỗi Heredoc hoạt động giống như chuỗi trích dẫn kép. Nó bắt đầu với<<<. Sau toán tử này, một định danh được cung cấp, sau đó là một dòng mới. Chuỗi chính nó theo sau, và sau đó cùng một định danh để đóng báo giá. Bạn không cần phải thoát dấu ngoặc kép trong cú pháp này.
  4. Cú pháp chuỗi Nowdoc (kể từ PHP 5.3.0) hoạt động về cơ bản giống như các chuỗi trích dẫn đơn. Sự khác biệt là thậm chí không có dấu ngoặc đơn hoặc dấu gạch chéo ngược phải được thoát. Một nowdoc được xác định với cùng một<<<chuỗi được sử dụng cho heredocs, nhưng mã định danh theo sau được đặt trong dấu ngoặc đơn, ví dụ<<<'EOT'. Không có phân tích cú pháp được thực hiện trong nowdoc.

Ghi chú: Dấu ngoặc đơn bên trong dấu ngoặc đơn và dấu ngoặc kép bên trong dấu ngoặc kép phải được thoát:

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

Tốc độ:
Tôi sẽ không đặt quá nhiều trọng lượng vào các trích dẫn đơn nhanh hơn các trích dẫn kép. Họ có thể nhanh hơn trong một số tình huống. Đây là một bài viết giải thích một cách trong đó các trích dẫn đơn và kép về cơ bản là nhanh như nhau kể từ PHP 4.3 ( Useless Optimizationsvề phía dưới, phần C). Ngoài ra, trang điểm chuẩn này có một so sánh trích dẫn đôi. Hầu hết các so sánh là như nhau. Có một so sánh trong đó dấu ngoặc kép chậm hơn dấu ngoặc đơn.


17
+1 cho thủ thuật nẹp xoăn. Không nhận thức được điều đó. Quá tệ, nó không tuân theo các quy ước tương tự như shell script, tức là ${variablename}.
devios1

6
Tôi chỉ sử dụng dấu ngoặc kép, khi tôi cần nó \n, bất cứ điều gì khác trong PHPmã của tôi đều nằm trong dấu ngoặc đơn.
Jo Smo

có vẻ như 'heredoc' được chuyển sang PHP từ bash hay không? Dù sao câu trả lời tuyệt vời, vì vậy một lời cảm ơn +1.
sjsam

2
Lưu ý thú vị trong các nhận xét tài liệu PHP: php.net/manual/en/lingu.types.opes.php#120160 - "Các chuỗi trích dẫn kép" trông rất chậm vì chúng phải phân tích mọi thứ cho \ n dấu gạch chéo ngược và $ đô la dấu hiệu để thực hiện mở rộng biến ", hóa ra là phương thức nối chuỗi FASTEST trong PHP - PERIOD! Dấu ngoặc đơn chỉ nhanh hơn nếu chuỗi của bạn hoàn toàn bằng chữ (không có gì để phân tích trong đó và không có gì để ghép), nhưng lề là rất nhỏ và không thành vấn đề. "
dregad

1
Lưu ý: sự chậm chạp của "dấu ngoặc kép là tất cả nhưng là một điều của quá khứ. Các bản cập nhật đã tăng xử lý các trích dẫn kép để nhanh như vậy, trong tất cả các trường hợp ngoại trừ cực đoan, những ngày này.
SherylHohman

211

Những điều được đánh giá trong dấu ngoặc kép nhưng không phải trong đơn:

$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
Các dấu ngoặc đơn thoát và dấu gạch chéo ngược được thoát được mở rộng ngay cả trong các chuỗi trích dẫn đơn.
Peter Ajtai

43
Một lỗi mà nhiều nhà phát triển mới đối với PHP đang chạy: đó $mailbody = 'I want a line break:\nDone.';là giữ cho sự \nsống. Trong khi đó: $mailbody = "I want a line break:\nDone.";sẽ phân tích cú pháp ngắt dòng.
Kai Noack

Hai xu của tôi chỉ cần cho các cuộc phỏng vấn hoặc phát triển phần mềm độc hại. Chỉ cần so sánh var_dump () từ hai biểu thức: $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}!'; Chuỗi ký tự $testWithAsciiAndUtf8Charactersđược chuyển thành chuỗi với các chữ cái thực.
Rostyslav Pylypenko

56

' Trích dẫn đơn

Cách đơn giản nhất để xác định một chuỗi là đặt nó trong dấu ngoặc đơn. Trích dẫn đơn thường nhanh hơn và mọi thứ được trích dẫn bên trong được coi là chuỗi đơn giản.

Thí dụ:

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

" Trích dẫn kép

Sử dụng dấu ngoặc kép trong PHP để tránh phải sử dụng dấu chấm để phân tách mã (Lưu ý: Sử dụng dấu ngoặc nhọn {}để bao gồm các biến nếu bạn không muốn sử dụng .toán tử concatenation ( )) trong chuỗi.

Thí dụ:

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

Có một lợi ích hiệu suất trích dẫn duy nhất so với trích dẫn kép trong PHP?

Đúng. Nó là hơi nhanh hơn để sử dụng dấu ngoặc đơn.

PHP sẽ không sử dụng xử lý bổ sung để diễn giải những gì bên trong trích dẫn. Khi bạn sử dụng dấu ngoặc kép, PHP phải phân tích cú pháp để kiểm tra xem có bất kỳ biến nào trong chuỗi không.


Các một ngoại lệ đối với dấu nháy đơn KHÔNG phân tích bất cứ điều gì trong chuỗi, là những gì bạn có thể sử dụng \'để thoát khỏi một dấu nháy đơn duy nhất cho sử dụng trong chuỗi (hoặc \\'để hiển thị các dấu chéo ngược). Lưu ý rằng các chuỗi thoát truyền thống, chẳng hạn như \nsẽ KHÔNG được phân tích cú pháp sang ký tự dòng mới. Tài liệu PHP trên chuỗi
SherylHohman

Tôi thấy trên tất cả các câu trả lời rằng: bạn có thể sử dụng tên của biến trong dấu ngoặc kép để in ra giá trị của biến, nhưng bạn đang nói, tên biến cũng nên được đặt trong dấu ngoặc nhọn để tránh sự cần thiết phải sử dụng nối giai đoạn = Stage. Vậy nếu cả "$ my_var" và "{$ my_var}" xuất ra giá trị $ my_var, thì các dấu ngoặc nhọn để làm gì? Cảm ơn!
Bahman.A

40

Một chuỗi trích dẫn đơn không có các biến trong nó được diễn giải. Một chuỗi trích dẫn đôi.

Ngoài ra, một chuỗi trích dẫn kép có thể chứa dấu nháy đơn mà không có dấu gạch chéo ngược, trong khi một chuỗi trích dẫn đơn có thể chứa dấu ngoặc kép không được trích dẫn.

Các chuỗi trích dẫn đơn nhanh hơn trong thời gian chạy vì chúng không cần phải phân tích cú pháp.


8
Chuỗi trích dẫn đơn cũng sử dụng ít bộ nhớ hơn. Cách nhanh nhất để xử lý các chuỗi trong PHP là với các trích dẫn đơn và sử dụng. toán tử để nối chuỗi và biến.
RibaldEddie

hmmm, sửa tôi nếu tôi sai nhưng ngôn ngữ cơ bản cho PHP là C phải không? Vậy thì tại sao các trích dẫn chuỗi khác nhau trong PHP và C?
cướp waminal

1
@rob waminal: PHP có thể được triển khai bằng C, nhưng nó là một ngôn ngữ khác. Ngôn ngữ PHP chỉ định các ngữ nghĩa này.
Borealid

@Ribald - Cú pháp nowdoc sẽ nhanh hơn chứ? Các chuỗi trích dẫn đơn được phân tích cú pháp để thoát dấu ngoặc đơn và dấu gạch chéo ngược.
Peter Ajtai

@Peter, bạn có thể đúng, tôi chưa bao giờ bận tâm đến việc thực sự tìm hiểu về nó. Tài liệu PHP đưa ra yêu cầu tốc độ, tôi quyết định tin vào các tài liệu về đức tin. :)
RibaldEddie

27

Trong PHP, cả hai 'my name'"my name"là chuỗi. Bạn có thể đọc thêm về nó tại hướng dẫn PHP .

Điều bạn nên biết là

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

Trong PHP, người ta sử dụng dấu nháy đơn để xác định một chuỗi liên tục, giống như 'a', 'my name', 'abc xyz', trong khi sử dụng dấu nháy kép để xác định một chuỗi chứa định danh như "a $b $c $d".

Và điều khác là,

echo 'my name';

nhanh hơn

echo "my name";

nhưng

echo 'my ' . $a;

chậm hơn

echo "my $a";

Điều này đúng với việc sử dụng chuỗi khác.


18

Ví dụ về dấu ngoặc đơn, kép, heredoc và 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

Trong PHP, văn bản trích dẫn đơn được coi là giá trị chuỗi và văn bản trích dẫn kép sẽ phân tích các biến bằng cách thay thế và xử lý giá trị của chúng.

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

Ở đây, trích dẫn kép phân tích giá trị và trích dẫn đơn được coi là giá trị chuỗi (không phân tích cú pháp $testbiến.)


12

Cả hai loại ký tự kèm theo là chuỗi. Một loại trích dẫn được sử dụng thuận tiện để kèm theo các loại trích dẫn khác. "'"'"'. Sự khác biệt lớn nhất giữa các loại dấu ngoặc kép là các tham chiếu định danh kèm theo được thay thế cho dấu ngoặc kép bên trong, nhưng không nằm trong dấu ngoặc đơn.


3

Sự khác biệt giữa việc sử dụng dấu ngoặc đơn và dấu ngoặc kép trong php là nếu chúng ta sử dụng dấu ngoặc đơn trong câu lệnh echo thì nó được coi là một chuỗi. ... nhưng nếu chúng ta nhập tên biến trong dấu ngoặc kép thì nó sẽ xuất giá trị của biến đó cùng với chuỗi.


0

Dưới đây là một số khả năng của dấu ngoặc đơn và dấu ngoặc kép với biến

$world = "world";

"Hello '.$world.' ";

'hello ".$world."';

-1

Một điều:

Điều rất quan trọng cần lưu ý là dòng có số nhận dạng đóng của Heredoc không được chứa các ký tự khác, ngoại trừ dấu chấm phẩy (;) . Điều đó có nghĩa là đặc biệt là mã định danh có thể không được thụt lề và có thể không có bất kỳ khoảng trắng hoặc tab nào trước hoặc sau dấu chấm phẩy.

Thí dụ:

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

1
Đây là một tuyên bố đúng, nhưng không có gì để làm với câu hỏi ở đây.
miken32

-1

Có lẽ tôi hơi muộn và hơi lạc đề, nhưng dù sao thì đây vẫn là:

Bạn không nhất thiết phải chọn vì nội dung chuỗi của bạn nằm giữa:
alert("It's \"game\" time.");hoặcalert('It\'s "game" time.');

Nếu bạn quen với việc sử dụng dấu ngoặc kép tiếng Anh và ký tự chính xác cho dấu nháy đơn, bạn có thể sử dụng dấu ngoặc kép hoặc dấu ngoặc đơn, vì nó sẽ không còn quan trọng nữa:
alert("It’s “game” time.");alert('It’s “game” time.');

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.