ความแตกต่างระหว่าง single และ double quotes ใน php.ini คืออะไร? ความแตกต่างระหว่างสตริงเครื่องหมายคำพูดเดี่ยวและคู่ใน PHP คืออะไร? รายละเอียดการใช้งานประเภทสตริง
ไม่มีความลับที่เครื่องหมายคำพูดใน PHP สามารถเป็นแบบเดี่ยวหรือคู่ได้ มาดูกันว่าเมื่อใดการใช้เครื่องหมายคำพูดบางอย่างมีความเหมาะสมมากกว่า
คำพูดเดี่ยว
วิธีที่ง่ายที่สุดในการกำหนดสตริงคือการใส่ข้อความด้วยเครื่องหมายคำพูดเดี่ยว
หากเราจำเป็นต้องใช้เครื่องหมายคำพูดเดี่ยวในข้อความ เราจำเป็นต้องหลีกเลี่ยงเครื่องหมายดังกล่าวด้วยเครื่องหมายทับ (\)
ลำดับหลีกภายในเครื่องหมายคำพูดเดียวใช้ไม่ได้
ตัวอย่างการใช้เครื่องหมายคำพูดเดี่ยว:
เครื่องหมายคำพูดคู่
หากคุณเน้นข้อความด้วยเครื่องหมายคำพูดคู่ สตริงจะถูกกำหนดในลักษณะเดียวกับเครื่องหมายคำพูดเดี่ยว แต่แน่นอนว่ามีความแตกต่างระหว่างคำพูด
สถานการณ์ที่มีเครื่องหมายคำพูด Escape จะเหมือนกับสถานการณ์ที่มีเครื่องหมายคำพูดเดี่ยว
สตริงที่อยู่ในเครื่องหมายคำพูดคู่จะจดจำลำดับการหลีกเลี่ยงส่วนใหญ่สำหรับอักขระพิเศษ
ความแตกต่างที่สำคัญที่สุดคือความจริงที่ว่าเครื่องหมายคำพูดคู่จัดการกับตัวแปร
ตัวอย่างการใช้เครื่องหมายคำพูดคู่:
เรามาเน้นที่ความจริงที่ว่าสตริงที่มีเครื่องหมายคำพูดคู่จัดการตัวแปร
จะเกิดอะไรขึ้นเมื่อมีการประมวลผลสตริง? ล่าม ตรวจสอบแต่ละสตริงด้วยเครื่องหมายคำพูดคู่สำหรับตัวแปร, เช่น. การบังคับให้แยกวิเคราะห์เกิดขึ้น ซึ่งต้องใช้เวลาเพิ่มเติม ใช่ บ่อยครั้งที่นี่เป็นเสี้ยววินาที แต่ต้องเข้าใจความจริงด้วยตัวมันเอง นั่นคือ หากคุณเปรียบเทียบการประมวลผลของสตริงหนึ่งกับเครื่องหมายคำพูดที่แตกต่างกัน (แน่นอนว่าไม่มีตัวแปร) สตริงที่มีเครื่องหมายคำพูดเดี่ยวจะได้รับการประมวลผลเร็วขึ้นอย่างแน่นอน
การคำนวณ
บนเว็บไซต์ ProfiPHP ฉันพบการคำนวณที่น่าสนใจ หัวข้อนี้. ผู้เขียนเขียนสคริปต์ง่ายๆ ซึ่งเขาคำนวณเวลาในการประมวลผลสตริง
บทความสั้น ๆ นี้แสดงวิธีการใช้และตำแหน่ง คำพูดใน PHP.
เครื่องหมายคำพูดเดี่ยว (เครื่องหมายอะพอสทรอฟี) ใน PHP
สตริงที่อยู่ในเครื่องหมายคำพูดเดี่ยวจะไม่ถูกประมวลผลในทางใดทางหนึ่งโดย PHP นั่นคือเครื่องหมายคำพูดเดี่ยวแสดงถึงข้อความที่อยู่ระหว่างข้อความเหล่านั้นตามที่เป็นอยู่
// แก้ไขเสียงสะท้อน "ชีวิตเป็นอย่างไรบ้าง"; echo "ชีวิตเป็นยังไงบ้าง? $name"; echo "ชีวิตเป็นอย่างไรบ้าง?".$name; // เสียงสะท้อนไม่ถูกต้อง "สบายดีไหม $name";
อักขระพิเศษในเครื่องหมายคำพูดเดี่ยวและคู่
เพื่อให้แน่ใจว่า ตัวอย่างเช่น อักขระแท็บ (\t) ถูกตีความเป็นอักขระแท็บแทนที่จะเป็นเครื่องหมายทับและตัวอักษร t คุณต้องล้อมบรรทัดข้อความที่มีอักขระแท็บด้วยเครื่องหมายคำพูดคู่ คุณสามารถใช้ \' และ \\ ในเครื่องหมายคำพูดเดี่ยวเท่านั้น ลำดับหลีกอื่นๆ ทั้งหมด (\n, \r, \$, ฯลฯ) จะไม่ได้รับอนุญาตภายในเครื่องหมายคำพูดเดี่ยว
// เสียงสะท้อนไม่ถูกต้อง "สบายดีไหม\n"; // แก้ไขเสียงก้อง "สบายดีไหม?\n";
หากต้องการหลีกเลี่ยงเครื่องหมายคำพูดคู่ภายในสตริง ให้วางเครื่องหมายคำพูดไว้หน้าเครื่องหมายแบ็กสแลช \"
// เสียงสะท้อนไม่ถูกต้อง "
ว่าไง?
"; // แก้ไขเสียงสะท้อน"ว่าไง?
"; เอคโค่"ว่าไง?
";เครื่องหมายคำพูดคู่ใน PHP
ข้อความที่อยู่ในเครื่องหมายคำพูดคู่จะถือว่าแตกต่างกันมาก ตัวอย่างเช่น ตัวแปรที่อยู่ในเครื่องหมายคำพูดคู่จะถูกแทนที่ด้วยค่าของตัวแปรเหล่านั้น ทำให้สะดวกในการคอมไพล์ แบบสอบถาม SQLใช้เครื่องหมายคำพูดคู่
$query = "แทรกลงในตาราง (โพสต์,ผู้เขียน,ข้อความ,วันที่) ค่า ("$id","$author","$text","$date"");
ฉันไม่ใช่ผู้เชี่ยวชาญในการเขียนโปรแกรม PHP แต่ฉันสับสนเล็กน้อยว่าทำไมฉันถึงเห็นโค้ดบางตัวใน PHP โดยมีสตริงอยู่ในเครื่องหมายคำพูดเดี่ยวและบางครั้งก็เป็นคู่
ฉันเพิ่งรู้ว่าในภาษา .NET หรือ C หากอยู่ในเครื่องหมายคำพูดเดี่ยว หมายความว่าเป็นอักขระ ไม่ใช่สตริง
สารละลาย
สิ่งที่คุณควรรู้
$a = "ชื่อ"; $b = "$a ของฉัน"; == "ชื่อของฉัน" $c = "$a ของฉัน"; != "ชื่อของฉัน"
ใน PHP ผู้คนใช้เครื่องหมายคำพูดเดี่ยวเพื่อกำหนดสตริงคงที่เช่น "a" , "ชื่อของฉัน" , "abc xyz" ในขณะที่ใช้เครื่องหมายคำพูดคู่เพื่อกำหนดสตริงที่มีตัวระบุเช่น "a $b $c $d"
และอีกอย่างก็คือ
ก้อง "ชื่อของฉัน";
เร็วกว่า
ก้อง "ชื่อของฉัน";
เอคโค่ "ของฉัน" . $a;
ช้ากว่า
สะท้อน "$ ของฉัน";
สิ่งนี้เป็นจริงสำหรับสตริงอื่นที่ใช้
ใน PHP ข้อความในเครื่องหมายคำพูดเดี่ยวจะถือเป็นค่าสตริง ในขณะที่ข้อความในเครื่องหมายคำพูดคู่จะแยกวิเคราะห์ตัวแปรโดยการแทนที่และประมวลผลค่า
$test = "ตัวแปร"; echo "สวัสดีคุณ $test"; // ผลลัพธ์จะเป็น: Hello Mr ตัวแปร echo "Hello Mr $test"; // ผลลัพธ์จะเป็น: สวัสดีคุณ $test
ในที่นี้เครื่องหมายคำพูดคู่จะแยกวิเคราะห์ค่าและเครื่องหมายคำพูดเดี่ยวจะถือเป็นค่าสตริง (โดยไม่ต้องแยกวิเคราะห์ตัวแปร $test)
อักขระที่ซ้อนกันทั้งสองชนิดเป็นสตริง สะดวกในการใช้ใบเสนอราคาประเภทหนึ่งเพื่อสรุปใบเสนอราคาประเภทอื่น """ และ """ ความแตกต่างที่ใหญ่ที่สุดระหว่างประเภทเครื่องหมายคำพูดคือการอ้างอิงตัวระบุที่ซ้อนกันจะถูกแทนที่ด้วยเครื่องหมายคำพูดคู่แทนที่จะเป็นเครื่องหมายคำพูดเดี่ยว
วิธีที่ง่ายที่สุดในการกำหนดสตริงคือการใส่เครื่องหมายคำพูดเดี่ยว (สัญลักษณ์ " ).
หากต้องการใช้เครื่องหมายคำพูดเดี่ยวภายในสตริง ให้หลีกด้วยเครื่องหมายแบ็กสแลช ( \ ). หากคุณต้องการเขียนแบ็กสแลชเอง ให้ทำซ้ำ ( \\ ). การใช้แบ็กสแลชอื่นๆ ทั้งหมดจะถูกตีความว่าเป็นอักขระปกติ ซึ่งหมายความว่าหากคุณพยายามใช้ลำดับหลีกอื่นๆ เช่น \rหรือ \nพวกมันจะถูกส่งออกตามที่เป็นอยู่ แทนที่จะเป็นพฤติกรรมพิเศษใดๆ
เสียงสะท้อน "นี่คือสตริงง่ายๆ";
เสียงสะท้อน “คุณยังสามารถแทรกลงในบรรทัดได้
อักขระขึ้นบรรทัดใหม่เช่นนี้
นี่ก็โอเค";
// ผลลัพธ์: อาร์โนลด์เคยกล่าวไว้ว่า: "ฉันจะกลับมา"
เสียงสะท้อน “วันหนึ่งอาร์โนลด์พูดว่า 'ฉันจะกลับมา';
เอคโค่ "คุณได้ลบ C:\\*.* หรือไม่?";
// ผลลัพธ์: คุณลบ C:\*.* หรือไม่?
echo "คุณได้ลบ C:\*.* หรือไม่" ;
// ผลลัพธ์: สิ่งนี้จะไม่ถูกขยาย: \n ขึ้นบรรทัดใหม่
เสียงสะท้อน "สิ่งนี้จะไม่ถูกขยาย: \n ขึ้นบรรทัดใหม่";
// ผลลัพธ์: $expand และตัวแปร $ตัวใดตัวหนึ่งจะไม่ถูกขยาย
เสียงสะท้อน "$expand และ $either ตัวแปรไม่ถูกขยาย";
?>
เครื่องหมายคำพูดคู่
หากสตริงอยู่ในเครื่องหมายคำพูดคู่ (") PHP จะจดจำลำดับการหลีกเลี่ยงเพิ่มเติมสำหรับอักขระพิเศษ:
ลำดับต่อมา | ความหมาย |
---|---|
\n | ขึ้นบรรทัดใหม่ (LF หรือ 0x0A (10) ในรูปแบบ ASCII) |
\r | แคร่กลับ (CR หรือ 0x0D (13) ในรูปแบบ ASCII) |
\t | แท็บแนวนอน (HT หรือ 0x09 (9) ในรูปแบบ ASCII) |
\v | แท็บแนวตั้ง (VT หรือ 0x0B (11) ใน ASCII) (ตั้งแต่ PHP 5.2.5) |
\e | อักขระหลีก (ESC หรือ 0x1B (27) ใน ASCII) (ตั้งแต่ PHP 5.4.4) |
\ฉ | ฟีดหน้า (FF หรือ 0x0C (12) ใน ASCII) (ตั้งแต่ PHP 5.2.5) |
\\ | แบ็กสแลช |
\$ | เครื่องหมายดอลลาร์ |
\" | เครื่องหมายคำพูดคู่ |
\{1,3} | ลำดับของอักขระที่สอดคล้องกับนิพจน์ทั่วไปของอักขระในระบบเลขฐานแปด |
\x(1,2) | ลำดับของอักขระที่สอดคล้องกับนิพจน์ทั่วไปของอักขระในรูปแบบเลขฐานสิบหก |
เช่นเดียวกับสตริงที่อยู่ในเครื่องหมายคำพูดเดี่ยว การหลีกอักขระใดๆ จะเป็นการส่งเอาท์พุตแบ็กสแลชด้วย ก่อน PHP 5.1.1 ให้แบ็กสแลชเข้า \($วาร์)ไม่ได้เผยแพร่
เฮริด็อก
วิธีที่สามในการกำหนดสตริงคือการใช้ไวยากรณ์ heredoc: <<< . หลังจากโอเปอเรเตอร์นี้ คุณต้องระบุตัวระบุ จากนั้นจึงป้อนบรรทัด หลังจากนั้นบรรทัดนั้นก็มาถึง จากนั้นตัวระบุเดียวกันก็มาเพื่อปิดการแทรก
เส้น ต้องเริ่มต้นด้วยตัวระบุการปิด เช่น จะต้องปรากฏในคอลัมน์แรกของแถว นอกจากนี้ ตัวระบุต้องเป็นไปตามกฎการตั้งชื่อเดียวกันกับแท็กอื่นๆ ทั้งหมดใน PHP: มีเพียงอักขระตัวอักษรและตัวเลขและขีดล่าง และต้องไม่ขึ้นต้นด้วยตัวเลข (อนุญาตให้ใช้ขีดล่างได้)
ความสนใจ
เป็นสิ่งสำคัญมากที่จะต้องทราบว่าบรรทัดตัวระบุการปิดจะต้องไม่มีอักขระอื่นใดยกเว้นเครื่องหมายอัฒภาค ( ; ). ซึ่งหมายความว่ารหัส ไม่ควรเยื้องและต้องไม่มีช่องว่างหรือแท็บใดๆ ก่อนหรือหลังเครื่องหมายอัฒภาค สิ่งสำคัญคือต้องเข้าใจว่าอักขระตัวแรกก่อนตัวระบุการปิดต้องเป็นอักขระขึ้นบรรทัดใหม่ตามที่กำหนดโดยระบบปฏิบัติการของคุณ ตัวอย่างเช่น บนระบบ UNIX รวมถึง Mac OS X สิ่งนี้ \n. บรรทัดใหม่จะต้องเริ่มต้นทันทีหลังจากตัวระบุการปิด
หากกฎนี้ถูกละเมิดและตัวระบุการปิดไม่ "สะอาด" จะถือว่าตัวระบุการปิดหายไปและ PHP จะพยายามค้นหาต่อไป หากในกรณีนี้ไม่พบตัวระบุการปิดที่ถูกต้อง จะทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์โดยมีหมายเลขบรรทัดที่ส่วนท้ายของสคริปต์
Heredoc ไม่สามารถใช้ในการเริ่มต้นฟิลด์คลาสได้ เริ่มต้นจาก PHP 5.3 ข้อจำกัดนี้ใช้กับเอกสารที่มีตัวแปรเท่านั้น
ตัวอย่างที่ 1 ตัวอย่างที่ไม่ถูกต้อง
คลาสฟู(
สาธารณะ $bar =<<
อีโอที;
}
?>
ข้อความ Heredoc ทำงานในลักษณะเดียวกับสตริงในเครื่องหมายคำพูดคู่โดยไม่ต้องมี ซึ่งหมายความว่าคุณไม่จำเป็นต้องใช้ Escape เครื่องหมายคำพูดใน Heredoc แต่คุณยังสามารถใช้ Escape Sequence ด้านบนได้ ตัวแปรได้รับการประมวลผล แต่คุณต้องระมัดระวังเมื่อใช้ตัวแปรที่ซับซ้อนภายใน Heredoc เช่นเดียวกับเมื่อทำงานกับสตริง
ตัวอย่างที่ 2 ตัวอย่างการกำหนดสตริง heredoc
$str =<<
ครอบคลุมหลายบรรทัด
ใช้ไวยากรณ์ heredoc
อีโอดี;
คลาสฟู
{
var $foo ;
var $บาร์ ;
ฟังก์ชั่นฟู()
{
$นี่ -> ฟู = "ฟู" ;
$นี่ ->
}
}
$foo = ใหม่ foo();
$name = "ชื่อของฉัน" ;
เสียงสะท้อน<<
ตอนนี้ฉันกำลังอนุมาน( $foo -> บาร์ [ 1 ]) .
สิ่งนี้ควรแสดงอักษรตัวใหญ่ "A": \x41
อีโอที;
?>
ฉันชื่อ "ชื่อของฉัน" ฉันพิมพ์ฟู ตอนนี้ฉันส่งออก Bar2 สิ่งนี้ควรแสดงอักษรตัวใหญ่ "A": A
นอกจากนี้ยังเป็นไปได้ที่จะใช้ไวยากรณ์ heredoc เพื่อส่งข้อมูลผ่านอาร์กิวเมนต์ของฟังก์ชัน:
ตั้งแต่เวอร์ชัน 5.3.0 เป็นไปได้ที่จะเริ่มต้นตัวแปรสแตติกและคุณสมบัติคลาส/ค่าคงที่โดยใช้ไวยากรณ์ Heredoc:
ตัวอย่าง #4 การใช้ Heredoc เพื่อเริ่มต้นตัวแปรคงที่
// ตัวแปรแบบคงที่
ฟังก์ชั่นฟู()
{
$บาร์คงที่ =<<
// คุณสมบัติคลาส/ค่าคงที่
คลาสฟู
{
const บาร์ =<<
ฟูบาร์;
สาธารณะ $baz =<<
ฟูบาร์;
}
?>
ใน PHP 5.3.0 คุณยังสามารถล้อมรอบตัวระบุ Heredoc ด้วยเครื่องหมายคำพูดคู่ได้:
โนว์ด็อก
Nowdoc จะเหมือนกันสำหรับสตริงที่มีเครื่องหมายคำพูดเดี่ยว ในขณะที่ Heredoc ใช้สำหรับสตริงที่มีเครื่องหมายคำพูดคู่ Nowdoc คล้ายกับ Heredoc แต่อยู่ข้างใน ไม่มีการทดแทน. การออกแบบนี้เหมาะสำหรับการฝังโค้ด PHP หรือบล็อกข้อความขนาดใหญ่อื่นๆ โดยไม่ต้องหลบหนี ในกรณีนี้จะคล้ายกับโครงสร้าง SGML เล็กน้อย โดยการประกาศบล็อกข้อความที่ไม่ได้ตั้งใจให้ประมวลผล
Nowdoc ถูกระบุด้วยลำดับเดียวกัน <<< ซึ่งใช้ใน heredoc แต่ตัวระบุต่อไปนี้อยู่ในเครื่องหมายคำพูดเดี่ยว เช่น <<<"EOT" . เงื่อนไขทั้งหมดที่ใช้กับตัวระบุ Heredoc ยังใช้กับ nowdoc ด้วย โดยเฉพาะเงื่อนไขที่ใช้กับตัวระบุการปิด
ตัวอย่าง #6 ตัวอย่าง Nowdoc
$str =<<<"EOD"
ข้อความตัวอย่าง
ทอดยาวหลายบรรทัด
ใช้ไวยากรณ์ nowdoc
อีโอดี;
/* ตัวอย่างที่ซับซ้อนยิ่งขึ้นพร้อมตัวแปร */
คลาสฟู
{
สาธารณะ $foo ;
สาธารณะ $บาร์ ;
ฟังก์ชั่นฟู()
{
$นี่ -> ฟู = "ฟู" ;
$นี่ -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}
$foo = ใหม่ foo();
$name = "ชื่อของฉัน" ;
เสียงสะท้อน<<<"EOT"
ฉันชื่อ "$ชื่อ" ฉันพิมพ์ $foo->foo
ตอนนี้ฉันพิมพ์ ($foo->bar)
สิ่งนี้ไม่ควรแสดงตัวพิมพ์ใหญ่ "A": \x41
อีโอที;
?>
ผลลัพธ์ของการรันตัวอย่างนี้:
ฉันชื่อ "$ชื่อ" ฉันพิมพ์ $foo->foo ตอนนี้ฉันพิมพ์ ($foo->bar) สิ่งนี้ไม่ควรแสดงตัวพิมพ์ใหญ่ "A": \x41
ความคิดเห็น:
ต่างจาก Heredoc ตรงที่ Nowdoc สามารถใช้ในบริบทใดก็ได้ที่มีข้อมูลคงที่ ตัวอย่างทั่วไปของการเริ่มต้นฟิลด์คลาสหรือค่าคงที่:
ตัวอย่าง #7 ตัวอย่างการใช้ข้อมูลคงที่
คลาสฟู(
สาธารณะ $bar =<<<"EOT"
บาร์
อีโอที;
}
?>
ความคิดเห็น:
เพิ่มการรองรับ nowdoc ใน PHP 5.3.0
การจัดการตัวแปร
หากระบุสตริงด้วยเครื่องหมายคำพูดคู่ หรือใช้ Heredoc ตัวแปรภายในจะถูกประมวลผล
ไวยากรณ์มีสองประเภท: ง่ายและซับซ้อน ไวยากรณ์แบบง่ายนั้นง่ายกว่าและสะดวกกว่า ทำให้สามารถประมวลผลตัวแปรซึ่งเป็นค่าอาร์เรย์ ( อาร์เรย์) หรือคุณสมบัติของวัตถุ ( วัตถุ) โดยใช้ความพยายามน้อยที่สุด
ไวยากรณ์ที่ซับซ้อนสามารถระบุได้ด้วยเครื่องหมายปีกกาที่ล้อมรอบนิพจน์
ไวยากรณ์ง่ายๆ
หากล่ามพบเครื่องหมายดอลลาร์ ( $ ) โดยจะจับอักขระให้ได้มากที่สุดเพื่อสร้างชื่อตัวแปรที่ถูกต้อง หากคุณต้องการระบุส่วนท้ายของชื่อ ให้ใส่ชื่อตัวแปรไว้ในเครื่องหมายปีกกา
$juice = "แอปเปิ้ล" ;
echo "เขาดื่มน้ำผลไม้ $ นิดหน่อย" . PHP_EOL ;
// ใช้งานไม่ได้ "s" เป็นอักขระที่ถูกต้องสำหรับชื่อตัวแปร
// แต่ตัวแปรของเราชื่อ $juice
echo "เขาดื่มน้ำผลไม้ที่ทำจากน้ำผลไม้ $" ;
?>
ผลลัพธ์ของการรันตัวอย่างนี้:
เขาดื่มน้ำแอปเปิ้ล เขาดื่มน้ำผลไม้ที่ทำจาก.
องค์ประกอบอาร์เรย์ ( อาร์เรย์) หรือคุณสมบัติของวัตถุ ( วัตถุ). ในดัชนีอาร์เรย์จะมีวงเล็บเหลี่ยมปิด ( ] ) เป็นจุดสิ้นสุดของคำจำกัดความดัชนี กฎเดียวกันนี้ใช้กับคุณสมบัติของวัตถุเช่นเดียวกับตัวแปรอย่างง่าย
ตัวอย่างที่ 8 ตัวอย่างไวยากรณ์อย่างง่าย
$juices = array("apple" , "orange" , "koolaid1" => "สีม่วง" );
echo "เขาดื่มน้ำผลไม้ $juices [ 0 ]" . PHP_EOL ;
echo "เขาดื่มน้ำผลไม้ $juices [1]" . PHP_EOL ;
echo "เขาดื่มน้ำผลไม้ $juices [ koolaid1 ] บ้าง" . PHP_EOL ;
คนในชั้นเรียน (
สาธารณะ $john = "จอห์น สมิธ" ;
สาธารณะ $jan = "เจน สมิธ" ;
สาธารณะ $robert = "โรเบิร์ตพอลเซ่น" ;
สาธารณะ $สมิธ = "สมิธ" ;
}
$people = คนใหม่();
echo "$people -> john ดื่มน้ำผลไม้ $juices [ 0 ]" . PHP_EOL ;
echo " $people -> john กล่าวสวัสดี $people -> jane " . PHP_EOL ;
echo "$people -> ภรรยาของ john "ทักทาย $people -> robert" . PHP_EOL;
echo " $people -> robert ทักทาย $people สองคน -> smiths " ; //จะไม่ทำงาน
?>
ผลลัพธ์ของการรันตัวอย่างนี้:
เขาดื่มน้ำแอปเปิ้ล เขาดื่มน้ำส้ม เขาดื่มน้ำผลไม้สีม่วง จอห์น สมิธดื่มน้ำแอปเปิ้ล จากนั้นจอห์น สมิธก็กล่าวทักทายเจน สมิธ ภรรยาของจอห์น สมิธทักทายโรเบิร์ต พอลเซ็น โรเบิร์ต พอลเซ็นทักทายทั้งสอง
สำหรับสิ่งที่ซับซ้อนกว่านี้ ให้ใช้ไวยากรณ์ที่ซับซ้อน
ไวยากรณ์ที่ซับซ้อน (หยิก)
มันถูกเรียกว่าซับซ้อนไม่ใช่เพราะว่ามันยากที่จะเข้าใจ แต่เพราะมันทำให้สามารถใช้สำนวนที่ซับซ้อนได้
ตัวแปรสเกลาร์ องค์ประกอบอาร์เรย์ หรือคุณสมบัติของอ็อบเจ็กต์ใดๆ ที่แมปกับสตริงสามารถแสดงเป็นสตริงได้โดยใช้ไวยากรณ์นี้ เพียงเขียนนิพจน์ในลักษณะเดียวกับที่คุณเขียนนอกบรรทัดแล้วจึงปิดท้าย { และ } . เพราะว่า { ไม่สามารถหลีกหนีได้ ไวยากรณ์นี้จะรับรู้เมื่อเท่านั้น $ ตามมาโดยตรง { . ใช้ {\$ ปริ้น {$ . ตัวอย่างบางส่วน:
// แสดงข้อผิดพลาดทั้งหมด
error_reporting(E_ALL);
$great = "เยี่ยมมาก" ;
// ใช้งานไม่ได้ ผลลัพธ์: นี่คือ (เยี่ยมมาก)
echo "นี่คือ ( $great )" ;
// ใช้งานได้ ผลลัพธ์: เยี่ยมมาก
echo "นี่คือ ( $great ) " ;
echo "นี่คือ $( เยี่ยมมาก ) " ;
//ทำงาน
เสียงสะท้อน “จัตุรัสนี้กว้าง( $square -> width ) 00 เซนติเมตร" ;
// ใช้งานได้ คำหลักที่ยกมาใช้งานได้กับไวยากรณ์วงเล็บปีกกาเท่านั้น
echo "ใช้งานได้: ( $arr [ "key" ]) " ;
//ทำงาน
echo "ใช้งานได้: ( $arr [ 4 ][ 3 ]) " ;
// สิ่งนี้ไม่ถูกต้องด้วยเหตุผลเดียวกันกับ $foo ภายนอก
// บรรทัด. กล่าวอีกนัยหนึ่ง มันจะยังคงใช้งานได้
// แต่เนื่องจาก PHP ค้นหาค่าคงที่ foo ก่อน สิ่งนี้จะทำให้เกิด
// ข้อผิดพลาดระดับ E_NOTICE (ค่าคงที่ไม่ได้กำหนด)
เสียงสะท้อน “มันไม่ถูกต้อง:( $arr [ ฟู ][ 3 ]) " ;
//ทำงาน. เมื่อใช้อาร์เรย์หลายมิติภายใน
// บรรทัดจะใช้เครื่องหมายปีกกาเสมอ
echo "ใช้งานได้: ( $arr [ "foo" ][ 3 ]) " ;
//ทำงาน.
echo "ใช้งานได้:" . $arr [ "ฟู" ][ 3 ];
เสียงสะท้อน “วิธีนี้ใช้ได้ผลเช่นกัน:( $obj -> ค่า [ 3 ]-> ชื่อ ) " ;
เสียงสะท้อน “นี่คือค่าของตัวแปรที่ตั้งชื่อ$name : ($( $name )) " ;
เสียงสะท้อน "นี่คือค่าของชื่อตัวแปรที่ getName() ส่งคืน:($( getName ())) " ;
เสียงสะท้อน "นี่คือค่าของตัวแปรตามชื่อที่ \$object->getName() ส่งกลับ:($( $object -> getName ())) " ;
// ใช้งานไม่ได้ ผลลัพธ์: นี่คือสิ่งที่ getName() ส่งคืน: (getName())
เสียงสะท้อน "นี่คือสิ่งที่ getName() ส่งคืน: (getName())";
?>
นอกจากนี้ยังสามารถเข้าถึงคุณสมบัติของอ็อบเจ็กต์ภายในสตริงโดยใช้ไวยากรณ์นี้ได้
คลาสฟู(
var $bar = "ฉันคือบาร์" ;
}
$foo = ใหม่ foo();
$บาร์ = "บาร์" ;
$baz = array("foo" , "bar" , "baz" , "quux" );
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo -> $baz [ 1 ]) \n" ;
?>
ผลลัพธ์ของการรันตัวอย่างนี้:
ฉันคือบาร์ ฉันคือบาร์
ความคิดเห็น:
ฟังก์ชัน การเรียกเมธอด ตัวแปรคลาสแบบสแตติก และค่าคงที่คลาสทำงานภายใน {$} เริ่มต้นด้วย PHP 5 อย่างไรก็ตาม ค่าที่ให้มาจะถือเป็นชื่อตัวแปรในบริบทเดียวกับบรรทัดที่กำหนดไว้ การใช้เครื่องหมายปีกกาเดี่ยว ( {} ) จะไม่ทำงานในการเข้าถึงค่าของฟังก์ชัน วิธีการ ค่าคงที่ของคลาส หรือตัวแปรคลาสแบบคงที่
// แสดงข้อผิดพลาดทั้งหมด
error_reporting(E_ALL);
คลาสเบียร์ (
const softdrink = "รูทเบียร์" ;
สาธารณะ $ale = "ipa" ;
}
$rootbeer = "เอ แอนด์ ดับบลิว" ;
$ipa = "อเล็กซานเดอร์ คีธ\"s" ;
// ใช้งานได้ ผลลัพธ์: ฉันต้องการ A&W
echo "ฉันต้องการ ($( เบียร์ :: softdrink )) \n" ;
// วิธีนี้ใช้ได้ผลเช่นกัน ผลลัพธ์: ฉันต้องการของ Alexander Keith
echo "ฉันต้องการ ($( เบียร์ :: $ale )) \n" ;
?>
การเข้าถึงและการเปลี่ยนอักขระในสตริง
อักขระในสตริงสามารถใช้และแก้ไขได้โดยการระบุออฟเซ็ตจากจุดเริ่มต้นของสตริง เริ่มต้นที่ศูนย์ ในวงเล็บเหลี่ยมหลังสตริง เช่น $str คิดว่าสตริงสำหรับจุดประสงค์นี้เป็นอาร์เรย์ของอักขระ หากคุณต้องการรับหรือแทนที่อักขระมากกว่า 1 ตัว คุณสามารถใช้ฟังก์ชันได้ ซับสเตร()และ substr_replace().
ความคิดเห็น: อักขระในสตริงสามารถเข้าถึงได้โดยใช้เครื่องหมายปีกกา เช่น $str(42)
ความสนใจ
การพยายามเขียนออฟเซ็ตที่เกินขอบเขตของบรรทัดจะทำให้สตริงมีช่องว่างจนถึงออฟเซ็ตนั้น ประเภทที่ไม่ใช่จำนวนเต็มจะถูกแปลงเป็นประเภทจำนวนเต็ม ประเภทออฟเซ็ตที่ไม่ถูกต้องจะทำให้เกิดข้อผิดพลาดระดับ E_ประกาศ. การเขียนไปที่ออฟเซ็ตเชิงลบจะทำให้เกิดข้อผิดพลาดระดับ E_ประกาศและเมื่ออ่านแล้วก็จะส่งคืนสตริงว่าง มีการใช้เฉพาะอักขระตัวแรกของสตริงที่กำหนดเท่านั้น การกำหนดให้กับสตริงว่างจะกำหนดไบต์ว่าง (NULL)
ความสนใจ
สตริงใน PHP เป็นอาร์เรย์ภายในของไบต์ ด้วยเหตุนี้ การเข้าถึงหรือแก้ไขสตริงที่ออฟเซ็ตจึงไม่ปลอดภัยในการเข้ารหัสหลายไบต์ และควรทำด้วยสตริงในการเข้ารหัสไบต์เดียวเท่านั้น เช่น ISO-8859-1
ตัวอย่างที่ 9 ตัวอย่างสตริงบางส่วน
// รับอักขระตัวแรกของสตริง
$str = "นี่คือการทดสอบ" ;
$แรก = $str [ 0 ];
// รับอักขระตัวที่สามของสตริง
$สาม = $str [ 2 ];
// รับอักขระตัวสุดท้ายของสตริง
$str = "นี่ยังคงเป็นการทดสอบ" ;
$last = $str [ strlen ($str ) - 1 ];
// เปลี่ยนอักขระตัวสุดท้ายของบรรทัด
$str = "มองไปที่ทะเล" ;
$str [ strlen ($str )- 1 ] = "e" ;
?>
ตั้งแต่ PHP 5.4 เป็นต้นไป ค่าชดเชยในสตริงจะต้องระบุเป็นจำนวนเต็มหรือสตริงที่มีตัวเลข มิฉะนั้น จะมีการแจ้งเตือน ก่อนหน้านี้ชดเชยที่กำหนดโดยสตริงเช่น "ฟู"โดยไม่มีการแจ้งเตือนถูกแปลงเป็น 0 .
ตัวอย่าง #10 ความแตกต่างระหว่าง PHP 5.3 และ PHP 5.4
$str = "เอบีซี" ;
Var_dump($str["1"]);
var_dump (isset($str [ "1" ]));
Var_dump($str["1.0"]);
var_dump (isset($str [ "1.0" ]));
Var_dump($str["x"]);
var_dump (isset($str [ "x" ]));
Var_dump($str["1x"]);
var_dump (isset($str [ "1x" ]));
?>
ผลลัพธ์ของการรันตัวอย่างนี้ใน PHP 5.3:
สตริง (1) "b" บูล (จริง) สตริง (1) "b" บูล (จริง) สตริง (1) "a" บูล (จริง) สตริง (1) "b" บูล (จริง)
ผลลัพธ์ของการรันตัวอย่างนี้ใน PHP 5.4:
string(1) "b" bool(true) คำเตือน: สตริงที่ผิดกฎหมาย offset "1.0" ใน /tmp/t.php ออนไลน์ 7 string(1) "b" bool(false) คำเตือน: สตริงที่ผิดกฎหมาย offset "x" in / tmp/t.php ออนไลน์ 9 string(1) "a" bool(false) string(1) "b" bool(false)
ความคิดเห็น:
กำลังพยายามเข้าถึงตัวแปรประเภทอื่น (ยกเว้นอาร์เรย์หรือออบเจ็กต์ที่ใช้อินเทอร์เฟซบางอย่าง) โดยใช้ หรือ {} จะกลับมาอย่างเงียบๆ โมฆะ.
ความคิดเห็น:
PHP 5.5 เพิ่มการรองรับสำหรับการเข้าถึงอักขระในตัวอักษรสตริงโดยใช้ไวยากรณ์ หรือ {} .
มีฟังก์ชันที่มีประโยชน์มากมายสำหรับการแก้ไขสตริง
ฟังก์ชันพื้นฐานอธิบายไว้ในส่วนฟังก์ชันสตริง และสำหรับการค้นหาขั้นสูงและการแทนที่ ฟังก์ชันนิพจน์ทั่วไปหรือนิพจน์ทั่วไปที่เข้ากันได้กับ Perl
แปลงเป็นสตริง
ค่าสามารถแปลงเป็นสตริงได้โดยใช้การร่าย (เชือก)หรือฟังก์ชัน สตราวาล(). ในนิพจน์ที่จำเป็นต้องมีสตริง การแปลงจะเกิดขึ้นโดยอัตโนมัติ สิ่งนี้จะเกิดขึ้นเมื่อคุณใช้ฟังก์ชัน เสียงสะท้อนหรือ พิมพ์หรือเมื่อเปรียบเทียบค่าของตัวแปรกับสตริง การอ่านส่วนประเภทและการจัดการประเภทของคู่มือจะทำให้สิ่งต่อไปนี้ชัดเจนยิ่งขึ้น ดูสิ่งนี้ด้วย ประเภทชุด().
อาร์เรย์จะถูกแปลงเป็นสตริงเสมอ "อาร์เรย์"ดังนั้นคุณจึงไม่สามารถแสดงเนื้อหาของอาร์เรย์ได้ ( อาร์เรย์), โดยใช้ เสียงสะท้อนหรือ พิมพ์เพื่อดูว่ามีอะไรอยู่บ้าง หากต้องการดูองค์ประกอบเดียว ให้ใช้สิ่งที่ต้องการ เสียงสะท้อน $arr["foo"]. ดูคำแนะนำด้านล่างเกี่ยวกับวิธีการแสดง/ดูเนื้อหาทั้งหมด
ออบเจ็กต์ใน PHP 4 จะถูกแปลงเป็นสตริงเสมอ "วัตถุ". หากคุณต้องการแสดงค่าของฟิลด์ของวัตถุ ( วัตถุ) เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่อง โปรดอ่านต่อ หากคุณต้องการรับชื่อคลาสของอ็อบเจ็กต์ที่ต้องการ ให้ใช้ get_คลาส(). ตั้งแต่ PHP 5 วิธีการ __toString ก็มีให้บริการเช่นกัน
โมฆะจะถูกแปลงเป็นสตริงว่างเสมอ
ดังที่คุณเห็นข้างต้น การแปลงอาร์เรย์ วัตถุ หรือทรัพยากรโดยตรงเป็นสตริงไม่ได้ให้ข้อมูลที่เป็นประโยชน์เกี่ยวกับค่าอื่นนอกเหนือจากประเภท วิธีที่ดีกว่าในการส่งออกค่าสำหรับการดีบักคือการใช้ฟังก์ชัน พิมพ์_r()และ var_dump().
ค่าส่วนใหญ่ใน PHP สามารถแปลงเป็นสตริงสำหรับจัดเก็บข้อมูลถาวรได้ วิธีการนี้เรียกว่าการทำให้เป็นอนุกรม และสามารถทำได้โดยใช้ฟังก์ชัน ทำให้เป็นอนุกรม(). นอกจากนี้ หากการติดตั้ง PHP ของคุณรองรับ WDDX การทำให้ซีเรียลไลซ์เป็นโครงสร้าง XML ก็สามารถทำได้เช่นกัน
การแปลงสตริงให้เป็นตัวเลข
ถ้าสตริงได้รับการยอมรับว่าเป็นค่าตัวเลข ค่าผลลัพธ์และประเภทจะถูกกำหนดดังนี้
หากสตริงไม่มีอักขระใดๆ ".", "e" หรือ "E" และค่าของตัวเลขอยู่ภายในขีดจำกัดของจำนวนเต็ม (กำหนดไว้ PHP_INT_MAX) สตริงจะถูกรับรู้เป็นจำนวนเต็ม ( จำนวนเต็ม). ในกรณีอื่นๆ ทั้งหมดจะถือเป็นจำนวนจุดลอยตัว ( ลอย).
ค่าถูกกำหนดโดยจุดเริ่มต้นของสตริง หากบรรทัดขึ้นต้นด้วยค่าตัวเลขที่ถูกต้อง ระบบจะใช้ค่านั้น มิฉะนั้นค่าจะเป็น 0 (ศูนย์) ค่าตัวเลขที่ถูกต้องคือตัวเลขตั้งแต่หนึ่งหลักขึ้นไป (ซึ่งอาจมีจุดทศนิยม) โดยอาจนำหน้าด้วยเครื่องหมาย ตามด้วยเลขชี้กำลังที่เป็นทางเลือก เลขชี้กำลังคือ "e" หรือ "E" ตามด้วยตัวเลขหนึ่งหลักขึ้นไป
$foo = 1 + "10.5" ; // $foo เป็นแบบลอยตัว (11.5)
$foo = 1 + "-1.3e3" ; // $foo เป็นแบบลอยตัว (-1299)
$foo = 1 + "บ๊อบ-1.3e3" ; // $foo เป็นจำนวนเต็ม (1)
$foo = 1 + "บ๊อบ3" ; // $foo เป็นจำนวนเต็ม (1)
$foo = 1 + "หมูตัวเล็ก 10 ตัว" ; // $foo เป็นจำนวนเต็ม (11)
$foo = 4 + "10.2 ลูกหมูน้อย" ; // $foo เป็นแบบลอยตัว (14.2)
$foo = "10.0 สุกร " + 1 ; // $foo ลอย (11)
$foo = "10.0 สุกร " + 1.0 ; // $foo ลอย (11)
?>
มากกว่า รายละเอียดข้อมูลสำหรับข้อมูลเกี่ยวกับการแปลงนี้ โปรดดูหัวข้อ strtod(3) ในเอกสารประกอบ Unix
หากคุณต้องการทดสอบตัวอย่างใดๆ ในส่วนนี้ ให้คัดลอกและวางและบรรทัดต่อไปนี้เพื่อดูว่าเกิดอะไรขึ้น:
echo "\$foo== $foo ; ประเภท: " gettype ($foo) . "
\n" ;
?>
อย่าคาดหวังว่าจะได้รับโค้ดของอักขระโดยการแปลงเป็นจำนวนเต็ม (ดังที่ทำเสร็จแล้ว เช่น ใน C) หากต้องการแปลงอักขระเป็นรหัส ASCII และย้อนกลับ ให้ใช้ฟังก์ชัน ลำดับ()และ ch().
รายละเอียดการใช้งานประเภทสตริง
ประเภทสตริง ( เชือก) ใน PHP ถูกนำมาใช้เป็นอาร์เรย์ของไบต์และจำนวนเต็มที่มีความยาวของบัฟเฟอร์ ไม่มีข้อมูลใด ๆ เกี่ยวกับวิธีการแปลงไบต์เหล่านี้เป็นอักขระ โดยปล่อยให้งานนี้ตกเป็นหน้าที่ของโปรแกรมเมอร์ ไม่มีข้อจำกัดเกี่ยวกับเนื้อหาของสตริง เช่น ไบต์ที่มีค่า 0 (ไบต์ "NUL") สามารถอยู่ที่ใดก็ได้ (อย่างไรก็ตาม โปรดทราบว่าฟังก์ชันบางอย่างตามที่ระบุไว้ในคู่มือนี้ ไม่ใช่ "ไบนารีที่ปลอดภัย" กล่าวคือ สามารถส่งสตริงไปยังไลบรารีที่ละเว้นข้อมูลหลังจาก NUL -byte)
ลักษณะของประเภทสตริงนี้อธิบายว่าทำไม PHP ไม่มีประเภท "ไบต์" แยกต่างหาก - สตริงมีบทบาทนั้น ฟังก์ชันที่ส่งคืนข้อมูลที่ไม่ใช่ข้อความ เช่น สตรีมข้อมูลที่กำหนดเองที่อ่านจากซ็อกเก็ตเครือข่าย จะยังคงส่งคืนสตริง
เมื่อพิจารณาถึงข้อเท็จจริงที่ว่า PHP ไม่ได้กำหนดการเข้ารหัสเฉพาะสำหรับสตริง อาจมีคนถามว่าแล้วเข้ารหัสตัวอักษรของสตริงอย่างไร เช่น เส้น "á" เทียบเท่า "\xE1"(ISO-8859-1) "\xC3\xA1"(UTF-8, รูปแบบการทำให้เป็นมาตรฐาน C), "\x61\xCC\x81"(UTF-8, รูปแบบการทำให้เป็นมาตรฐาน D) หรือการเป็นตัวแทนอื่น ๆ ที่เป็นไปได้? คำตอบก็คือ สตริงจะถูกเข้ารหัสในลักษณะเดียวกับที่เขียนในไฟล์สคริปต์ ดังนั้น หากสคริปต์เขียนด้วยการเข้ารหัส ISO-8859-1 สตริงก็จะถูกเข้ารหัสด้วย ISO-8859-1 เป็นต้น อย่างไรก็ตาม กฎนี้ใช้ไม่ได้เมื่อเปิดใช้งานโหมด Zend Multibyte: ในกรณีนี้ สามารถเขียนสคริปต์ด้วยการเข้ารหัสใดๆ (ไม่ว่าจะระบุอย่างชัดเจนหรือกำหนดโดยอัตโนมัติ) จากนั้นแปลงเป็นการเข้ารหัสภายในเฉพาะ ซึ่งจะใช้ในภายหลังสำหรับ ตัวอักษรสตริง โปรดทราบว่าการเข้ารหัสสคริปต์ (หรือการเข้ารหัสภายในหากเปิดใช้งาน Zend Multibyte) มีข้อจำกัดบางประการ: การเข้ารหัสจะต้องเป็น superset ของ ASCII เกือบทุกครั้ง เช่น UTF-8 หรือ ISO-8859-1 โปรดทราบว่าการเข้ารหัสที่ขึ้นกับสถานะซึ่งสามารถใช้ค่าไบต์เดียวกันในสถานะกะเริ่มต้นและไม่ใช่เริ่มต้นอาจทำให้เกิดปัญหาได้
แน่นอนว่า เพื่อให้เป็นประโยชน์ ฟังก์ชันสตริงจะต้องตั้งสมมติฐานบางประการเกี่ยวกับการเข้ารหัสสตริง น่าเสียดายที่ฟังก์ชัน PHP มีแนวทางแก้ไขปัญหานี้ค่อนข้างหลากหลาย:
- ฟังก์ชันบางอย่างถือว่าสตริงถูกเข้ารหัสในการเข้ารหัสแบบไบต์เดี่ยวบางฟังก์ชัน แต่ไม่จำเป็นต้องตีความไบต์เป็นอักขระเฉพาะเพื่อให้ทำงานได้อย่างถูกต้อง หมวดหมู่นี้รวมถึง ตัวอย่างเช่น ซับสเตร(), สตรอส(), สเตรน()และ strcmp(). วิธีคิดอีกวิธีหนึ่งเกี่ยวกับฟังก์ชันเหล่านี้ก็คือ ทำงานบนบัฟเฟอร์หน่วยความจำ เช่น มันทำงานโดยตรงกับไบต์และออฟเซ็ต ชดเชย
- ฟังก์ชันอื่นๆ คาดว่าการเข้ารหัสจะถูกส่งผ่านเป็นพารามิเตอร์ อาจถือว่าการเข้ารหัสเริ่มต้นบางอย่างหากไม่ได้ระบุพารามิเตอร์การเข้ารหัส ฟังก์ชั่นนี้คือ
- สุดท้ายนี้ มีฟังก์ชันที่ถือว่าสตริงใช้การเข้ารหัสเฉพาะ ซึ่งปกติจะเป็น UTF-8 ฟังก์ชันส่วนใหญ่จากส่วนขยาย intl และ PCRE จะอยู่ที่นี่ (ในกรณีหลัง เฉพาะเมื่อระบุตัวแก้ไขเท่านั้น ยู). แม้ว่าสิ่งนี้จะทำโดยตั้งใจ แต่ฟังก์ชั่น utf8_decode()หมายถึงการเข้ารหัส UTF-8 และ utf8_encode()- ISO-8859-1.
ท้ายที่สุดแล้ว การเขียนโปรแกรมที่ถูกต้องซึ่งทำงานกับ Unicode หมายถึงการหลีกเลี่ยงฟังก์ชันที่ไม่ทำงานกับ Unicode อย่างระมัดระวังและมีแนวโน้มที่จะทำให้ข้อมูลเสียหาย และใช้ฟังก์ชันที่ถูกต้องแทน ซึ่งโดยปกติจะมาจากส่วนขยาย intl และ mbstring อย่างไรก็ตาม การใช้ฟังก์ชันที่รองรับ Unicode ถือเป็นการเริ่มต้นที่ดี ไม่ว่าภาษานั้นจะมีคุณสมบัติอะไรก็ตาม จำเป็นต้องทราบข้อกำหนดเฉพาะของ Unicode เอง ตัวอย่างเช่น หากโปรแกรมสันนิษฐานว่าในภาษานั้นมีเพียงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เท่านั้น ก็ถือว่าเกิดข้อผิดพลาดใหญ่
ฉันควรใช้เครื่องหมายคำพูดประเภทใดในการจัดรูปแบบสตริง - เครื่องหมายอัญประกาศเดี่ยวหรือเครื่องหมายคำพูดคู่แบบคลาสสิก
เรามาดูความแตกต่างระหว่าง double quotes และ single quotes ใน PHP กัน และใช้ตัวอย่างเพื่อดูว่าควรใช้อันไหนเมื่อใด
ตัวแปรและลำดับหลีกสำหรับอักขระพิเศษที่พบในสตริงที่อยู่ในเครื่องหมายคำพูดเดี่ยวจะไม่ได้รับการประมวลผล สตริงที่ล้อมรอบด้วยเครื่องหมายอะพอสทรอฟีจะถูกประมวลผลโดยล่าม PHP ได้เร็วกว่าสตริงที่คล้ายกันที่ล้อมรอบด้วยเครื่องหมายคำพูดคู่
เหตุผลง่ายๆ: ล่าม PHP ตรวจสอบสตริงเพิ่มเติมในเครื่องหมายคำพูดคู่เพื่อดูว่ามีตัวแปรอยู่หรือไม่ และหากพบตัวแปรเหล่านั้น ค่าของมันจะถูกแทรกลงในสตริงแทนชื่อตัวแปร แต่ล่ามจะรับรู้บรรทัดที่อยู่ในเครื่องหมายอะพอสทรอฟีว่าเป็นข้อความปกติ และ PHP จะไม่ทำการเปลี่ยนแปลงใดๆ ในบรรทัดเหล่านี้ ฉันคิดว่าชัดเจนว่าการประมวลผลสตริงในเครื่องหมายคำพูดเดี่ยวจะเร็วขึ้นไม่ว่าในกรณีใด
ขั้นแรก เรามาอธิบายวิธีกำหนดสตริง จากนั้นตรวจสอบว่าจะประมวลผลสตริงด้วยเครื่องหมายคำพูดเดี่ยวได้เร็วแค่ไหน
วิธีที่ง่ายที่สุดในการกำหนดสตริงคือการใส่เครื่องหมายคำพูดเดี่ยว (") หากต้องการใช้เครื่องหมายคำพูดเดี่ยวภายในสตริงที่มีเครื่องหมายคำพูดเดี่ยว เครื่องหมายเหล่านั้นจะต้องนำหน้าด้วยเครื่องหมายแบ็กสแลช (\) นั่นคือเป็น Escape หากเครื่องหมายแบ็กสแลชต้องมา ก่อนเครื่องหมายคำพูดเดี่ยวหรืออยู่ท้ายบรรทัด คุณต้องทำซ้ำ หากคุณพยายามหลีกเลี่ยงอักขระอื่น แบ็กสแลชจะถูกพิมพ์ด้วย
นี่คือตัวอย่างการใช้เครื่องหมายคำพูดเดี่ยว:
// เอาท์พุต: สตริงอย่างง่าย
echo "สตริงธรรมดา";
// พิมพ์: ฉันอยู่ที่นี่
echo "ฉันอยู่ที่นี่";
// ผลลัพธ์: สิ่งนี้จะไม่แทรก: \n บรรทัดใหม่
echo "สิ่งนี้จะไม่แทรก:\nnewline";
// ผลลัพธ์: ตัวแปร $example จะไม่ถูกแทนที่เช่นกัน
echo "ตัวแปร $example จะไม่ถูกแทนที่เช่นกัน"; หากสตริงอยู่ในเครื่องหมายคำพูดคู่ (") PHP จะรับรู้ ปริมาณมากลำดับการควบคุมสำหรับอักขระพิเศษและยังทดแทนค่าของมันแทนชื่อตัวแปรในสตริง เช่นเดียวกับเครื่องหมายคำพูดเดี่ยว ในการใช้เครื่องหมายคำพูดคู่ภายในสตริงที่มีเครื่องหมายคำพูดคู่ จะต้องนำหน้าด้วยอักขระแบ็กสแลช (\)
นี่คือตัวอย่างการใช้เครื่องหมายคำพูดคู่:
// เอาท์พุต: สตริงอย่างง่าย
echo "สตริงธรรมดา";
// ผลลัพธ์: บริษัท "Snowdrop"
echo "บริษัท \"สโนว์ดรอป\"";
// ผลลัพธ์: สิ่งนี้จะนำไปสู่การขึ้นบรรทัดใหม่
echo "สิ่งนี้จะขึ้นบรรทัดใหม่ \n";
// ผลลัพธ์: ตัวแปรจะถูกแทนที่
$example = "จะถูกแทนที่";
echo "ตัวแปร $ ตัวอย่าง"; ควรจำไว้ว่าลำดับ "\n" ( บรรทัดใหม่), "\r" (การขึ้นบรรทัดใหม่) สำหรับข้อความธรรมดา ไม่ใช่ HTML ดังนั้นคุณจะไม่เห็นการเปลี่ยนแปลงในเบราว์เซอร์ (เฉพาะใน รหัสแหล่งที่มาหน้า)
เรามาดูกันว่าราคาเดี่ยวเร็วกว่าราคาคู่มากแค่ไหน สำหรับการวัด เราจะเขียนสคริปต์ทดสอบสั้นๆ และเราจะทราบทันทีว่าหากคุณทดสอบด้วยตัวเอง ผลลัพธ์ซึ่งขึ้นอยู่กับฮาร์ดแวร์ของพีซีหรือเซิร์ฟเวอร์ของคุณจะแตกต่างออกไป
// ส่งคืนการประทับเวลาที่จุดเริ่มต้นของการวนซ้ำ
$start = ไมโครไทม์(จริง);
// สร้างลูปสำหรับการวนซ้ำ 1 ล้านครั้ง
สำหรับ ($i = 0; $i< 1000000; $i++) {
$text = "นี่คือสตริงอักขระ";
}
// คำนวณเวลาที่ใช้
$time = (ไมโครไทม์(จริง) - $เริ่มต้น); ผลลัพธ์: 0.09 วินาที
หากเราแทนที่เครื่องหมายคำพูดเดี่ยวด้วยเครื่องหมายคำพูดคู่:
$text = "นี่คือสตริงอักขระ"; ผลลัพธ์จะเป็น 0.10 วินาที
อย่างที่คุณเห็น เมื่อใช้สตริงข้อความ เวลาดำเนินการต่างกันน้อยมาก และอาจกล่าวได้ว่าไม่มีเลยด้วยซ้ำ ความสนุกเริ่มต้นขึ้นเมื่อเราพยายามรวมสตริงและตัวแปรเข้าด้วยกัน
$text = "นี่คือสายอักขระ $i"; หรือ
$text = $i"นี่คือสตริงอักขระ"; ผลลัพธ์ประมาณ: 0.27 วินาที
ความแตกต่างค่อนข้างชัดเจน การต่อข้อมูลและเครื่องหมายคำพูดคู่จะส่งผลต่อประสิทธิภาพอย่างชัดเจนเมื่อมีการเพิ่มตัวแปรลงในสตริง
เมื่อเซิร์ฟเวอร์ประมวลผลโค้ด เซิร์ฟเวอร์จะตรวจสอบเนื้อหาทั้งหมดของเครื่องหมายคำพูดคู่เพื่อดูตัวแปร ค่าคงที่ และอื่นๆ มันต้องใช้เวลา และเซิร์ฟเวอร์จะประมวลผลสิ่งที่อยู่ระหว่างเครื่องหมายคำพูดเดี่ยวเป็นข้อความสำเร็จรูปและไม่สนใจว่ามีอะไรอยู่ที่นั่น ความแตกต่างระหว่างประสิทธิภาพของเครื่องหมายคำพูดเดี่ยวและคู่นั้นน้อยมาก แต่หากคุณกำลังพัฒนาโปรเจ็กต์ที่มีการโหลดสูง การประหยัดเวลาเพียงไม่กี่มิลลิวินาทีก็ถือเป็นชัยชนะแล้ว