PHP - nối hoặc chèn trực tiếp các biến trong chuỗi


224

Tôi tự hỏi, cách thích hợp để chèn các biến PHP vào một chuỗi là gì?

Cách này:

echo "Welcome ".$name."!"

Hoặc theo cách này:

echo "Welcome $name!"

Cả hai phương pháp này đều hoạt động trong tôi PHP v5.3.5. Cái sau ngắn hơn và đơn giản hơn nhưng tôi không chắc cái đầu tiên có định dạng tốt hơn hay được chấp nhận là phù hợp hơn.


18
nếu bạn đang làm việc đầu tiên, cá nhân tôi thích trích dẫn duy nhấtecho 'Welcome '.$name.'!';
KJYe.Name


2
@ kjy112 Tôi đã nói điều tương tự trong câu trả lời của mình, tôi là một fan cuồng nhiệt của những trích dẫn đơn: X
Khez

11
Cá nhân, tôi bỏ qua toàn bộ "trích dẫn đơn có hiệu quả hơn" và chỉ sử dụng "sử dụng kiểu trích dẫn nào yêu cầu số lần thoát nội bộ cuối cùng". Rất khó có khả năng bất kỳ mã nào bạn viết sẽ được hưởng lợi từ bất kỳ lợi ích MICROSCOPIC nào do phân tích chuỗi ít hơn so với nối chuỗi tăng.
Marc B

1
Yêu cầu mất hiệu suất là sai. Xem bài viết này để tham khảo: nikic.github.io/2012/01/09/ từ
Damian

Câu trả lời:


344

Giữa hai cú pháp đó, bạn thực sự nên chọn một cú pháp bạn thích :-)

Cá nhân, tôi sẽ đi với giải pháp thứ hai của bạn trong trường hợp như vậy (Nội suy biến) , mà tôi thấy dễ dàng hơn để viết và đọc.

Kết quả sẽ giống nhau; và ngay cả khi có ý nghĩa về hiệu suất, những điều đó sẽ không thành vấn đề 1 .


Là một sidenote, vì vậy câu trả lời của tôi đầy đủ hơn một chút: ngày bạn sẽ muốn làm một cái gì đó như thế này:

echo "Welcome $names!";

PHP sẽ diễn giải mã của bạn như thể bạn đang cố sử dụng $namesbiến - không tồn tại. - lưu ý rằng nó sẽ chỉ hoạt động nếu bạn sử dụng "" không '' cho chuỗi của mình.

Ngày đó, bạn sẽ cần sử dụng {}:

echo "Welcome {$name}s!"

Không cần phải dự phòng để nối.


Cũng lưu ý rằng cú pháp đầu tiên của bạn:

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

Có thể được tối ưu hóa , tránh ghép nối, sử dụng:

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

(Nhưng, như tôi đã nói trước đó, điều này không quan trọng lắm ...)


1 - Trừ khi bạn đang thực hiện hàng trăm ngàn phép nối so với phép nội suy - và có lẽ không hoàn toàn như vậy.


3
Tuyệt vời cảm ơn bạn! thật tuyệt khi biết rằng tôi có thể sử dụng phương pháp yêu thích của mình để chèn nó trực tiếp vào chuỗi, và tôi rất biết ơn vì bây giờ biết cách tách biến khỏi phần còn lại của sting nếu cần sử dụng {}.
Web_Designer

64
Chỉ cần lưu ý rằng việc phân tách chuỗi ký tự và biến bằng dấu phẩy chỉ hoạt động với echo, không phải ở bất kỳ nơi nào khác.
colincameron

3
Chỉ cần chỉ ra hiệu suất: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(Ghép nối) thực sự mất khoảng 300 mili giây (đối với 200.000 mặt hàng, đó là 1 miliseconf trên một nghìn yếu tố trên bộ của bạn ...). Đó là tiếng ồn thống kê, thậm chí không thể đo được bất kỳ sự khác biệt nào. Xem xét nó dễ đọc hơn, time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(Nội suy) là người chiến thắng không thể tranh cãi ...
Fernando Cordeiro

1
Nếu muốn sử dụng phép nội suy, bạn phải sử dụng dấu ngoặc kép.
Máxima Alekz

Có thể sử dụng các hàm bên trong chuỗi? như echo "Đây là {foo ()} hay"; ?
strix25

17

Các chuỗi trích dẫn kép thanh lịch hơn vì bạn không phải ngắt chuỗi của mình mỗi khi bạn cần chèn một biến (giống như bạn phải làm với các chuỗi trích dẫn đơn).

Tuy nhiên, nếu bạn cần chèn giá trị trả về của hàm, điều này không thể được chèn vào chuỗi trích dẫn kép - ngay cả khi bạn bao quanh nó bằng dấu ngoặc!

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

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

10
Bạn có thể chèn các hàm bán gián tiếp vào các chuỗi thông qua các hàm biến PHP 5.3. $x = function() { ...}; $string = "hello {$x(blah blah blah)}", hoạt động xung quanh "hạn chế".
Marc B

5
@Marc Thật tuyệt, tôi không biết điều đó! Bạn cũng có thể gán tên của hàm hiện có cho một biến và thực hiện tương tự:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
Michael

3
Điều đó thật tuyệt nhưng cực kỳ khó đọc, vì vậy, dù sao thì người ta cũng phải tránh nó.
Ý thức chung của bạn

2
$s = 'Hello ' . trim($world) .'!';Hãy thử sử dụng các trích dẫn đơn khi không có gì để nội suy trong chuỗi. Nó sẽ cải thiện hiệu suất và có thể được sử dụng như một quy ước để xác định cả hai
Sarath Sadasivan Pillai

9

Vì php4 bạn có thể sử dụng một định dạng chuỗi:

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

Nguồn: sprintf ()


Cho đến nay các lựa chọn an toàn nhất. +1 để thực hành tốt và quy ước chung phù hợp với các ngôn ngữ khác
Javier Arias

6

Một trong hai là tốt. Sử dụng một trong đó có tầm nhìn tốt hơn cho bạn. Và nói về khả năng hiển thị, bạn cũng có thể kiểm tra printf .


5

Từ quan điểm làm cho suy nghĩ đơn giản , dễ đọc , nhất quándễ hiểu (vì hiệu suất không thành vấn đề ở đây):

  • Sử dụng các vars nhúng trong dấu ngoặc kép có thể dẫn đến các tình huống phức tạp và khó hiểu khi bạn muốn nhúng các thuộc tính đối tượng, mảng đa chiều, v.v. Nói chung, khi đọc các vars nhúng, bạn không thể chắc chắn 100% về hành vi cuối cùng của những gì bạn đang đọc .

  • Bạn thường xuyên cần thêm nạng như {}\, mà IMO cho biết thêm sự nhầm lẫn và làm cho dễ đọc nối gần tương đương, nếu không nói là tốt hơn.

  • Ngay khi bạn cần bọc một lệnh gọi xung quanh var, chẳng hạn htmlspecialchars($var), bạn phải chuyển sang ghép.

  • AFAIK, bạn không thể nhúng các hằng số.

Trong một số trường hợp cụ thể, "dấu ngoặc kép có nhúng vars" có thể hữu ích, nhưng nói chung, tôi sẽ đi ghép (sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép khi thuận tiện)


5

Tôi biết câu hỏi này đã có câu trả lời được chọn, nhưng tôi thấy bài viết này hiển nhiên cho thấy phép nội suy chuỗi hoạt động nhanh hơn so với nối. Nó có thể hữu ích cho những người vẫn còn nghi ngờ.


3

Đi với đầu tiên và sử dụng dấu ngoặc đơn!

  1. Nó dễ đọc hơn, nghĩa là các lập trình viên khác sẽ biết chuyện gì đang xảy ra
  2. Nó hoạt động nhanh hơn một chút, cách opcodes được tạo khi PHP phân tích mã nguồn của bạn, về cơ bản nó sẽ làm điều đó, vì vậy hãy giúp đỡ nó!
  3. Nếu bạn cũng sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép, bạn sẽ tăng hiệu suất của mình hơn nữa.

Các tình huống chỉ khi nào bạn nên sử dụng dấu ngoặc kép, là khi bạn cần \r, \n, \t! Chi phí không đáng để sử dụng trong mọi trường hợp khác.

Bạn cũng nên kiểm tra kết nối biến PHP , phpbench.com để biết một số điểm chuẩn về các phương pháp thực hiện khác nhau.


19
-1: Sử dụng dấu ngoặc đơn không có ảnh hưởng thực tế đến hiệu suất. Trang được liên kết hiển thị sự khác biệt giữa hai phương pháp tính bằng micrô giây , đó là 0,000001 giây. Bất kỳ truy vấn cơ sở dữ liệu sẽ mất hàng trăm lần thời gian đó. Cuộc tranh luận này là hoàn toàn vô nghĩa.
Pekka

Điểm tốt để đề cập \r, \n\tnhư các câu trả lời khác không bao gồm bit này.
evilReiko

2

Nó chỉ là vấn đề của hương vị.
Sử dụng bất cứ điều gì bạn muốn.

Hầu hết thời gian tôi đang sử dụng thứ hai nhưng nó phụ thuộc.

Hãy để tôi đề nghị bạn cũng có được cho mình một trình soạn thảo tốt sẽ làm nổi bật một biến bên trong chuỗi


Ive có textarea cần thiết. Đá PSPad .
Web_Designer

2

Đừng nối. Không cần thiết, chúng tôi dấu phẩy vì tiếng vang có thể có nhiều tham số

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

Về việc sử dụng dấu ngoặc đơn hoặc kép, sự khác biệt là không đáng kể, bạn có thể thực hiện các bài kiểm tra với số lượng lớn chuỗi để tự kiểm tra.


6
Điều này chỉ áp dụng cho tiếng vang, mặc dù. Hãy thử nó cho một nhiệm vụ biến và xem mã của bạn nổ tung.
Marc B

1

Bạn nên chọn cái đầu tiên. Họ không có sự khác biệt ngoại trừ hiệu suất, cái đầu tiên sẽ nhanh hơn so với cái thứ hai.

Nếu biến bên trong trích dẫn kép PHP cần có thời gian để phân tích biến.

Kiểm tra dấu ngoặc đơn này hoặc dấu ngoặc kép để nối biến?

Đây là một ví dụ khác Có một lợi ích hiệu suất trích dẫn so với trích dẫn kép trong php?

Tôi không hiểu tại sao câu trả lời này trong liên kết ở trên được nâng cấp và tại sao câu trả lời này lại bị downvote.

Như tôi đã nói điều tương tự.

Bạn có thể nhìn vào đây là tốt

Cái gì nhanh hơn trong PHP, dấu ngoặc đơn hay dấu ngoặc kép?


5
-1 để tối ưu hóa sớm. Sự khác biệt về hiệu suất không đủ để trở thành một yếu tố trừ khi bạn in hàng triệu lần trong một tập lệnh - và thậm chí sau đó, bất kỳ quá trình xử lý nào bạn thực hiện sẽ làm giảm thêm vài giây bạn có thể dành để in một cách thay vì cách khác . Sự khác biệt chính giữa chúng là khả năng đọc (dẫn đến tôi thích phong cách thứ hai).
cHao

1
Tôi có thể cố gắng trả lời câu hỏi cuối cùng của bạn. Có nhiều tin đồn hoang dã trong cộng đồng PHP và một số trong số chúng rất mạnh. Đó là cuộc đấu tranh lớn để tiết lộ chúng và mất thời gian. Nhưng dần dần nó sẽ thay đổi. Vì vậy, câu trả lời bạn liên kết đến là câu trả lời cũ, từ khi mọi người không quan tâm. Trong khi trong một số người này đã trả lời dựa trên kinh nghiệm của chính họ, chứ không phải trên một số bài báo họ đọc.
Ý thức chung của bạn

Mất hiệu suất là sai +1 @cHao. Đây là một bài viết với các số liệu chứng minh nó. nikic.github.io/2012/01/09/ từ
Damian

1

Nếu bạn muốn thực thi một SQLlệnh và các biến của bạn là thành viên mảng, thì bạn không nên sử dụng các dấu ngoặc đơn bên trong []mảng (như thế này ['']:); ví dụ: nếu bạn sử dụng chuỗi này làm lệnh SQL, bạn sẽ nhận được 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)

Chuỗi đúng là:

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

Bạn nên sử dụng PDO thay thế
s3c

0

Tôi biết đây là một câu hỏi cũ, nhưng tôi nghĩ ai đó phải đề cập đến tất cả ưu và nhược điểm:

Cú pháp tốt hơn : Đó là sở thích cá nhân.

Hiệu suất : Không có sự khác biệt. Như nhiều người đã đề cập, trích dẫn kép có thể nhanh hơn nếu sử dụng nhiều biến không hợp lý.

Cách sử dụng tốt hơn : Trích dẫn đơn (chủ yếu). Như @Khez đã nói, với một trích dẫn duy nhất, bạn có thể ghép bất cứ thứ gì, thậm chí cả các lệnh gọi hàm và sửa đổi biến, như vậy : echo 'hi ' . trim($name) . ($i + 1);. Điều duy nhất đôi quote thể làm điều đó đơn quote không thể làm là sử dụng \n, \r, \tvà như nhau.

Khả năng đọc : Không có sự khác biệt (có thể áp dụng sở thích cá nhân).

Khả năng ghi / Khả năng ghi lại / Gỡ lỗi : Trong các câu lệnh 1 dòng không có sự khác biệt, nhưng khi xử lý nhiều dòng, việc nhận xét / bỏ dòng dễ dàng hơn trong khi gỡ lỗi hoặc viết. Ví dụ:

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

Ít thoát : Trích dẫn đơn. Đối với trích dẫn đơn, bạn chỉ cần thoát 2 ký tự ( '\). Đối với dấu nháy kép bạn cần phải thoát khỏi 2 ký tự ( ", \) và 3 nhiều hơn nếu cần thiết ( $, {}).

Ít thay đổi : Trích dẫn đơn. Ví dụ: nếu bạn có đoạn mã sau:

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

Và bạn cần tăng 1 đến $ i, để nó trở thành lượt thích:

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

Nhưng để báo giá kép, bạn sẽ cần thay đổi điều này:

echo "Number $i!";

đến đây:

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

Kết luận : Sử dụng những gì bạn thích .

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.