PHP - เชื่อมต่อหรือแทรกตัวแปรในสตริงโดยตรง


224

ฉันสงสัยว่าอะไรคือวิธีที่เหมาะสมในการแทรกตัวแปร PHP ลงในสตริง?

ทางนี้:

echo "Welcome ".$name."!"

หรือด้วยวิธีนี้:

echo "Welcome $name!"

PHP v5.3.5ทั้งสองวิธีการเหล่านี้ทำงานในของฉัน หลังนี้สั้นกว่าและเรียบง่ายกว่า แต่ฉันไม่แน่ใจว่ารูปแบบแรกนั้นดีกว่าหรือเป็นที่ยอมรับว่าเหมาะสมกว่าหรือไม่


18
ถ้าคุณทำครั้งแรกฉันชอบอ้างเดี่ยวecho 'Welcome '.$name.'!';
KJYe.Name 葉家仁


2
@ kjy112 ฉันพูดในสิ่งเดียวกันในคำตอบของฉันฉันเป็นแฟนตัวยงของคำพูดเดียว: X
Khez

11
โดยส่วนตัวแล้วฉันไม่สนใจ "คำพูดเดียวที่มีประสิทธิภาพมากขึ้น" และไป "ใช้รูปแบบการอ้างอิงใด ๆ ที่ต้องใช้จำนวนครั้งสุดท้ายของการหลบหนีภายใน" มันไม่น่าเป็นไปได้สูงที่รหัสใด ๆ ที่คุณเขียนจะได้รับประโยชน์จากการได้รับ MICROSCOPIC ใด ๆ เนื่องจากการแยกสตริงน้อยลงเทียบกับการต่อสตริงที่เพิ่มขึ้น
Marc B

1
การเรียกร้องการสูญเสียประสิทธิภาพเป็นเท็จ ดูบทความนี้เป็นข้อมูลอ้างอิง: nikic.github.io/2012/01/09/…
Damian

คำตอบ:


344

ระหว่างไวยากรณ์ทั้งสองนี้คุณควรเลือกอย่างที่คุณต้องการ :-)

โดยส่วนตัวแล้วฉันจะใช้วิธีแก้ปัญหาที่สองของคุณในกรณีเช่นนี้(การแก้ไขตัวแปร)ซึ่งฉันทั้งเขียนและอ่านง่ายขึ้น

ผลลัพธ์จะเหมือนกัน และแม้ว่าจะมีผลกระทบต่อประสิทธิภาพการทำงานเหล่านั้นจะไม่สำคัญ1


ในฐานะ sidenote ดังนั้นคำตอบของฉันจึงค่อนข้างสมบูรณ์มากขึ้น: วันที่คุณต้องการทำสิ่งนี้:

echo "Welcome $names!";

PHP จะตีความรหัสของคุณราวกับว่าคุณกำลังพยายามใช้$namesตัวแปรซึ่งไม่มีอยู่ - โปรดทราบว่ามันจะใช้งานได้ถ้าคุณใช้ "" ไม่ใช่ "" สำหรับสตริงของคุณ

ในวันนั้นคุณจะต้องใช้{}:

echo "Welcome {$name}s!"

ไม่จำเป็นต้องย้อนกลับไปยังการต่อข้อมูล


โปรดทราบว่าไวยากรณ์แรกของคุณ:

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

อาจปรับให้เหมาะสมโดยหลีกเลี่ยงการต่อข้อมูลโดยใช้:

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

(แต่อย่างที่ฉันบอกไปก่อนหน้านี้มันไม่สำคัญมาก ... )


1 - ยกเว้นว่าคุณกำลังทำการเชื่อมต่อหลายร้อยหลายพันเทียบกับการสอดแทรก - และอาจไม่เป็นเช่นนั้น


3
ยอดเยี่ยมขอบคุณ! {}มันเป็นสิ่งที่ดีมากที่จะรู้ว่าฉันสามารถใช้วิธีการที่ชื่นชอบการแทรกโดยตรงลงในสตริงและผมรู้สึกขอบคุณมากสำหรับตอนนี้รู้วิธีการแยกตัวแปรจากส่วนที่เหลือของการต่อยถ้าจำเป็นต้องใช้
Web_Designer

64
เพียงแค่ทราบว่าการแยกสตริงตัวอักษรและตัวแปรด้วยเครื่องหมายจุลภาคจะทำงานได้กับechoทุกที่เท่านั้น
colincameron

3
เพียงแค่ชี้ให้เห็นถึงประสิทธิภาพ: time php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = $string.$i; } print("Done!\n");'(การต่อข้อมูล) เสียจริงประมาณ 300 มิลลิวินาที (สำหรับ 200.000 รายการนั่นคือ 1 miliseconf ต่อ 1 พันองค์ประกอบในชุดของคุณ ... ) นั่นเป็นเสียงรบกวนทางสถิติเป็นไปไม่ได้ที่จะวัดความแตกต่าง เมื่อพิจารณาว่ามันอ่านได้ง่ายขึ้นtime php -r '$string=""; for ($i=0;$i<199999;$i++){ $string = "{$string}{$i}"; } print("Done!\n");'(การแก้ไข) เป็นผู้ชนะที่ไม่มีปัญหา ...
Fernando Cordeiro

1
หากต้องการใช้การแก้ไขคุณต้องใช้เครื่องหมายคำพูดคู่
Máxima Alekz

เป็นไปได้ที่จะใช้ฟังก์ชั่นภายในสตริง? ชอบ echo "นี่คือ {foo ()} ดี"; ?
strix25

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)}"ซึ่งใช้งานได้กับ "ข้อ จำกัด "
Marc B

5
@ Marc นั่นเจ๋งมากฉันไม่รู้เลย! นอกจากนี้คุณยังสามารถกำหนดชื่อของฟังก์ชั่นที่มีอยู่ให้กับตัวแปรและทำสิ่งเดียวกัน:$x = 'trim'; $string = "hello {$x('blah blah blah')}";
ไมเคิล

3
มันเจ๋ง แต่อ่านไม่ได้สุดขีดดังนั้นต้องหลีกเลี่ยงมันอยู่ดี
สามัญสำนึกของคุณ

2
$s = 'Hello ' . trim($world) .'!';ลองใช้การเสนอราคาเดี่ยวเมื่อไม่มีสิ่งใดที่จะสอดแทรกในสตริงมันจะปรับปรุงประสิทธิภาพและสามารถใช้เป็นแบบแผนในการระบุทั้งสอง
Sarath Sadasivan Pillai

9

ตั้งแต่ php4 คุณสามารถใช้รูปแบบสตริง:

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

ที่มา: sprintf ()


โดยตัวเลือกที่ปลอดภัยที่สุด +1 สำหรับการปฏิบัติที่ดีและการประชุมทั่วไปที่ตรงกับภาษาอื่น
Javier Arias

6

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


5

จากมุมมองของการทำคิดที่เรียบง่าย , อ่าน , สอดคล้องและง่ายต่อการเข้าใจ (ตั้งแต่ประสิทธิภาพการทำงานไม่ได้เรื่องที่นี่):

  • การใช้ vars แบบฝังในเครื่องหมายคำพูดคู่สามารถนำไปสู่สถานการณ์ที่ซับซ้อนและสับสนเมื่อคุณต้องการฝังคุณสมบัติของวัตถุ, อาร์เรย์แบบหลายมิติเป็นต้นซึ่งโดยทั่วไปเมื่ออ่าน vars แบบฝังคุณจะไม่สามารถแน่ใจได้ 100% ทันทีจากพฤติกรรมสุดท้ายของสิ่งที่คุณกำลังอ่าน .

  • คุณต้องเพิ่มไม้ค้ำบ่อย ๆ เช่น{}และ\IMO ใดที่เพิ่มความสับสนและทำให้การอ่านค่าแบบเรียงต่อกันเกือบเทียบเท่าหากไม่ดีขึ้น

  • ทันทีที่คุณต้องการตัดการเรียกฟังก์ชันรอบ ๆ var ตัวอย่างเช่นhtmlspecialchars($var)คุณต้องสลับไปที่การต่อข้อมูล

  • AFAIK คุณไม่สามารถฝังค่าคงที่ได้

ในบางกรณีการใช้ "เครื่องหมายคำพูดคู่กับการฝัง vars" อาจมีประโยชน์ แต่โดยทั่วไปฉันจะใช้การต่อเรียง (ใช้เครื่องหมายคำพูดเดี่ยวหรือคู่เมื่อสะดวก)


5

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


3

ไปกับคำแรกและใช้คำพูดเดียว!

  1. อ่านง่ายกว่าหมายถึงโปรแกรมเมอร์คนอื่นจะรู้ว่าเกิดอะไรขึ้น
  2. มันทำงานได้เร็วขึ้นเล็กน้อยวิธีที่ opcodes ถูกสร้างขึ้นเมื่อ PHP ตัดโค๊ดซอร์สโค้ดของคุณมันก็จะทำแบบนั้นอยู่ดีดังนั้นให้มันช่วยด้วย!
  3. หากคุณใช้เครื่องหมายคำพูดเดี่ยวแทนที่จะเป็นเครื่องหมายคำพูดคู่คุณจะเพิ่มประสิทธิภาพให้ดียิ่งขึ้น

สถานการณ์เฉพาะเมื่อคุณควรใช้คำพูดสองคือเมื่อคุณต้องการ\r, \n, \t! ค่าใช้จ่ายไม่คุ้มที่จะใช้ในกรณีอื่น ๆ

คุณควรตรวจสอบการเรียงต่อกันของตัวแปร PHP , phpbench.comสำหรับการวัดประสิทธิภาพของวิธีการต่าง ๆ


19
-1: การใช้อัญประกาศเดี่ยวไม่มีผลต่อประสิทธิภาพการทำงาน แต่อย่างใด เพจที่เชื่อมโยงแสดงความแตกต่างระหว่างสองวิธีในหน่วยไมโครวินาทีนั่นคือ0.000001วินาที แบบสอบถามฐานข้อมูลใด ๆ จะใช้เวลาหลายร้อยครั้ง การอภิปรายนี้ไม่มีจุดหมายอย่างสิ้นเชิง
Pekka

จุดที่ดีสำหรับการกล่าวขวัญ\r, \nและ\tเป็นคำตอบอื่น ๆ ไม่ได้รวมบิตนี้
evilReiko

2

เรื่องของรสชาติเท่านั้น
ใช้สิ่งที่คุณต้องการ

เวลาส่วนใหญ่ที่ฉันใช้ครั้งที่สอง แต่มันขึ้นอยู่กับ

ผมขอแนะนำให้คุณรับตัวแก้ไขที่ดีซึ่งจะเน้นตัวแปรภายในสตริง


ฉันได้รับ textarea ที่ต้องการ หินPSPad
Web_Designer

2

อย่าต่อกัน ไม่จำเป็นเราใช้จุลภาคเนื่องจาก echo สามารถใช้พารามิเตอร์หลายตัวได้

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

เกี่ยวกับการใช้เครื่องหมายคำพูดเดี่ยวหรือคู่ความแตกต่างนั้นเล็กน้อยคุณสามารถทำการทดสอบด้วยสตริงจำนวนมากเพื่อทดสอบด้วยตัวเอง


6
แม้ว่าจะใช้กับเสียงก้องเท่านั้น ลองใช้กับการกำหนดตัวแปรและดูรหัสของคุณระเบิด
Marc B

1

คุณควรเลือกอันแรก พวกเขาไม่มีความแตกต่างยกเว้นการแสดงตัวแรกจะเร็วกว่าการเปรียบเทียบอันที่สอง

หากตัวแปรภายใน PHP อ้างคู่ต้องใช้เวลาในการแยกวิเคราะห์ตัวแปร

ลองดูคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่เพื่อหาการต่อเรียงตัวแปร?

นี่เป็นอีกตัวอย่างหนึ่งมีประโยชน์ด้านประสิทธิภาพการอ้างอิงเดี่ยวกับการอ้างอิงแบบคู่ใน 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]')";

คุณควรใช้
PDO

0

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันคิดว่ามีคนพูดถึงข้อดี & ข้อเสียทั้งหมด:

ไวยากรณ์ที่ดีกว่า : นั่นเป็นความชอบส่วนตัว

ประสิทธิภาพ : ไม่มีความแตกต่าง ตามที่กล่าวมาหลายคำพูดสองครั้งอาจเร็วขึ้นหากใช้ตัวแปรหลายตัวที่ไม่สมจริง

การใช้งานที่ดีกว่า : อ้างเดี่ยว (ส่วนใหญ่) ในฐานะที่เป็น @Khez echo 'hi ' . trim($name) . ($i + 1);พูดพร้อมกับคำพูดเดียวที่คุณสามารถเชื่อมอะไรแม้ฟังก์ชั่นการโทรและการปรับเปลี่ยนตัวแปรเช่นดังนั้น: สิ่งเดียวที่อ้างดับเบิลสามารถทำเช่นนั้นอ้างเดียวไม่สามารถทำคือการใช้\n,\r ,\tและเหมือนกัน

การอ่าน : ไม่มีความแตกต่าง (อาจมีการตั้งค่าส่วนตัว)

Writability / Re-Writability / Debugging : ในงบ 1 บรรทัดไม่มีความแตกต่าง แต่เมื่อจัดการกับหลายบรรทัดมันจะง่ายต่อการคอมเม้นท์ / uncomment บรรทัดขณะทำการดีบั๊กหรือเขียน ตัวอย่างเช่น:

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

สรุป : การใช้สิ่งที่คุณต้องการ

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