PHP เครื่องหมายคำพูดเดี่ยวและคู่ ความแตกต่างระหว่าง double quotes และ single quotes ใน PHP ตัวอย่าง #3 ตัวอย่างคำจำกัดความสตริง Heredoc

อย่างที่คุณเห็นในบทช่วยสอนก่อนหน้านี้ คำสั่ง echo ใน php เป็นวิธีการแสดงผลข้อความ ตลอดอาชีพ PHP ของคุณ คุณจะใช้คำสั่ง echo มากกว่าคำสั่งอื่น ๆ ถ้าอย่างนั้นเรามาดูกันดีกว่า!

เอาต์พุตบรรทัด

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

ฉันชอบใช้ PHP!"; ?>

พูดประโยค “สวัสดี!” เราคุ้นเคยอยู่แล้วไม่มีอะไรใหม่ที่นี่ แต่อย่างที่คุณเห็นคำสั่ง echo ถัดไปมีแท็ก html ห้ามใช้แท็ก html เนื่องจาก php ให้การเปลี่ยนแปลงแก่เรา และสถิติและการออกแบบของหน้ายังอยู่ภายใต้การควบคุมของ html ทั่วไป

ระวังเครื่องหมายคำพูดคู่!

มันเจ๋งมากที่คุณสามารถส่งออก HTML ใน PHP ได้ อย่างไรก็ตาม คุณควรระมัดระวังเมื่อใช้โค้ด HTML หรือสตริงอื่นๆ ที่มีเครื่องหมายคำพูด! Echo ใช้เครื่องหมายคำพูดเพื่อกำหนดจุดเริ่มต้นและจุดสิ้นสุดของสตริง ดังนั้นคุณต้องใช้หนึ่งในตัวเลือกต่อไปนี้หากคุณต้องการใช้เครื่องหมายคำพูดภายใน echo:

  • อย่าใช้เครื่องหมายคำพูดภายในสตริง
  • หลีกเลี่ยงเครื่องหมายคำพูดภายในด้วยเครื่องหมายทับ เพื่อหลีกเลี่ยงการประมวลผลเครื่องหมายคำพูดภายใน เพียงใส่เครื่องหมายแบ็กสแลชไว้ข้างหน้า เช่น \"
  • ใช้เครื่องหมายคำพูดเดี่ยว (เครื่องหมายอะพอสทรอฟี) ภายในสตริง

ดูตัวอย่างของเราด้านล่างสำหรับการใช้คำสั่ง echo ที่ถูกต้องและไม่ถูกต้อง:

ฉันชอบใช้ PHP!"; // โอเค เพราะเราหนีเครื่องหมายคำพูด! echo "

ฉันชอบใช้ PHP!
"; // โอเค เพราะเราใช้อะพอสทรอฟี " echo "
ฉันชอบใช้ PHP!
"; ?>

หากคุณต้องการส่งออกสตริงที่มีเครื่องหมายคำพูด ให้ใช้เครื่องหมายอะพอสทรอฟี (') หรือหลีกเลี่ยงเครื่องหมายคำพูดโดยใส่เครื่องหมายทับ (\") ไว้ข้างหน้าเครื่องหมายเหล่านั้น แบ็กสแลชจะบอก PHP ว่าคุณต้องการให้ตัวละครหลังจากที่ล่ามไม่ถูกแยกวิเคราะห์!

เอาต์พุตตัวแปร

การหาตัวแปรนั้นง่ายมาก จริงๆ แล้ว คุณไม่จำเป็นต้องทำอะไรเป็นพิเศษเพื่อแสดงตัวแปรใน PHP เขาทำเองได้ นี่คือตัวอย่างที่จะช่วยให้คุณเข้าใจทุกอย่าง:

ผลลัพธ์:

สวัสดีบ๊อบ ฉันชื่อ: 4a

เอาต์พุตพร้อมกันของตัวแปรและสตริงข้อความ

คุณยังสามารถส่งออกตัวแปรด้วยเครื่องหมายคำพูดคู่ได้ (เช่น "ข้อความข้อความ $variable") ด้วยการใส่ตัวแปรไว้ในเครื่องหมายคำพูด ("") คุณจะบอก PHP ว่าคุณต้องการให้ตัวแปรรับค่าของมัน แปลงเป็นประเภทสตริง แล้วส่งออกออกมา ตัวอย่างด้านล่างแสดงวิธีการทำเคล็ดลับนี้อย่างถูกต้อง :)

"; echo "สวัสดี ฉันชื่อบ๊อบ คุณเป็นใคร? $my_string
"; echo "สวัสดี ฉันชื่อบ๊อบ คุณเป็นใคร? $my_string Bobetta"; -

ผลลัพธ์:

สวัสดีบ๊อบ ฉันชื่อ: Bobetta สวัสดี ฉันชื่อ Bob คุณเป็นใคร สวัสดี Bob ฉันชื่อ: สวัสดี ฉันชื่อ Bob คุณเป็นใคร? สวัสดีบ๊อบ ฉันชื่อ: โบเบตต้า

การวางตัวแปรไว้ในบรรทัดจะช่วยประหยัดเวลาและทำให้โค้ดของคุณอ่านง่ายขึ้น แต่ต้องใช้เวลาพอสมควรในการทำความคุ้นเคย อย่าลืมใช้เครื่องหมายคำพูด เครื่องหมายคำพูดเดี่ยวจะไม่แสดงค่าตัวแปร เครื่องหมายคำพูดเดี่ยวจะส่งออกชื่อตัวแปรไปที่สตริง เช่น $my_string ไม่ใช่ "สวัสดีบ๊อบ ฉันชื่อ”

เสียงสะท้อนไม่ใช่คุณสมบัติ!

Echo ไม่ใช่ฟังก์ชัน แต่เป็นโครงสร้างภาษา เมื่อใช้ฟังก์ชั่นใน PHP พวกมันจะมีรูปแบบที่เฉพาะเจาะจงมาก ซึ่งเราจะมาดูกันในภายหลัง สำหรับตอนนี้ รู้ไว้ก่อนว่าเสียงก้องเป็นเครื่องมือพิเศษที่คุณจะหลงรักอย่างแน่นอน! :D

การต่อสตริง PHP

บางทีการดำเนินการที่พบบ่อยที่สุดกับสตริงคือการต่อข้อมูลเข้าด้วยกัน หรือการรวมสตริงหนึ่งเข้ากับอีกสตริงหนึ่ง ในการต่อสตริงเข้าด้วยกัน มีการใช้โอเปอเรเตอร์พิเศษ “.” (จุด)

ตัวอย่าง:


ที่ผลลัพธ์เราจะได้ข้อความทั้งหมด: "ประเทศบ้านเกิดของฉันกว้างใหญ่!"

ค่าของประเภทสตริงคือสตริงข้อความ (สตริงโดยย่อ) สตริงคือลำดับของอักขระตั้งแต่ศูนย์ขึ้นไป อักขระประกอบด้วยตัวอักษร ตัวเลข เครื่องหมายวรรคตอน อักขระพิเศษ และช่องว่าง

สตริงสามารถกำหนดได้สี่วิธี:

  • เครื่องหมายคำพูดคู่
  • คำพูดเดียว
  • ไวยากรณ์นอกรีต
  • ไวยากรณ์ของโนว์ด็อก

สตริงในเครื่องหมายคำพูดคู่

สตริงในเครื่องหมายคำพูดคู่:

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

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


เครื่องหมายดอลลาร์: \$";

สตริงที่อยู่ในเครื่องหมายคำพูดคู่สามารถมีอักขระเครื่องหมายคำพูดเดี่ยวได้:

Echo "เครื่องหมายคำพูดเดี่ยว: "";

สตริงในเครื่องหมายคำพูดเดี่ยว (เครื่องหมายอะพอสทรอฟี)

สตริงในเครื่องหมายคำพูดเดี่ยว:

$str = "สตริง"; echo "บรรทัดใหญ่หนึ่งบรรทัดสามารถแบ่งออกเป็นบรรทัดเล็กๆ หลายบรรทัดเพื่อให้อ่านง่ายขึ้น";

ไม่เหมือนกับสตริงที่มีเครื่องหมายคำพูดคู่และไวยากรณ์ Heredoc ตัวแปรและลำดับการควบคุม (โดยมีข้อยกเว้นเดียว) ที่อยู่ในเครื่องหมายคำพูดเดี่ยวจะไม่ได้รับการประมวลผล ซึ่งหมายความว่าจะถูกตีความว่าเป็นอักขระสตริงปกติ:

$num = 10; เสียงสะท้อน "หมายเลข: $num
เครื่องหมายดอลลาร์: \$";

เพื่อให้สามารถใช้เครื่องหมายคำพูดเดี่ยวในสตริงที่อยู่ในเครื่องหมายคำพูดเดี่ยว คุณจะต้องหลีกเลี่ยงเครื่องหมายคำพูดเหล่านั้นโดยใช้เครื่องหมายแบ็กสแลช (\") หากคุณต้องการเขียนเครื่องหมายแบ็กสแลชเอง คุณจะต้องทำซ้ำ (\\):

Echo "ใช้เครื่องหมายคำพูด \"single\" ภายใน"; echo "แบ็กสแลช: \\";

สตริงที่อยู่ในเครื่องหมายคำพูดเดี่ยวสามารถมีอักขระเครื่องหมายคำพูดคู่ได้:

Echo "เครื่องหมายคำพูดคู่: "";

ไวยากรณ์ของเฮริด็อก

ไวยากรณ์ Heredoc เป็นอีกทางเลือกหนึ่งในการเขียนสตริง

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

ไวยากรณ์ Heredoc เริ่มต้นด้วยอักขระสามตัว<<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. ตรงไปตรงมาตัวระบุจะต้องขึ้นบรรทัดใหม่ ห้ามมิให้อักขระอื่นนอกจากบรรทัดใหม่ควรอยู่หลังตัวระบุ มิฉะนั้นจะเกิดข้อผิดพลาด ถัดมาคือเนื้อหาสตริงนั่นเอง หลังจากเนื้อหาสตริง ในบรรทัดที่แยกจากกัน จะต้องระบุตัวระบุการปิด (เช่นเดียวกับ after<<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

<<

ไวยากรณ์ของ Nowdoc

ไวยากรณ์ Nowdoc เช่น Heredoc เป็นอีกทางเลือกหนึ่งในการเขียนสตริง

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

ไวยากรณ์ของ Nowdoc คล้ายกับ Heredoc โดยมีข้อแตกต่างเพียงอย่างเดียวคือตัวระบุการเปิดจะต้องอยู่ในเครื่องหมายคำพูดเดี่ยว:

$num = 10; เสียงสะท้อน<<<"some_id" Число: $num some_id;

การจัดการตัวแปรในสตริง

มีไวยากรณ์สองประเภทสำหรับการจัดการตัวแปรในสตริง: เรียบง่ายและ ยาก.

ไวยากรณ์ง่ายๆ- นี่คือเมื่อมีการระบุชื่อตัวแปรในบรรทัดตามที่เป็นอยู่

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

$str = "โลก!"; echo "สวัสดี $str";

ไวยากรณ์ที่ซับซ้อน- นี่คือเมื่อชื่อตัวแปรอยู่ในวงเล็บปีกกา

เนื่องจากในการประมวลผลตัวแปรในบรรทัด ล่ามจะจับอักขระให้ได้มากที่สุด จึงมีสถานการณ์ที่ล่ามไม่สามารถระบุได้อย่างอิสระว่าชื่อตัวแปรสิ้นสุดที่ใด:

$sport1 = "จะ"; $sport2 = "เท้า"; echo "ฉันชอบ $sport1ball และ $sport2ball";

ในกรณีนี้ จะไม่บรรลุผลที่ต้องการเนื่องจากล่ามจะถือว่า $sport1 เป็นส่วนหนึ่งของชื่อตัวแปร $sport1bol ซึ่งไม่มีอยู่

หากต้องการบอกล่ามอย่างชัดเจนว่าชื่อตัวแปรสิ้นสุดที่ใด คุณต้องใส่ชื่อตัวแปรไว้ในเครื่องหมายปีกกา:

$sport1 = "จะ"; $sport2 = "เท้า"; echo "ฉันชอบ ($sport1)bol และ ($sport2)bol";

เครื่องหมายดอลลาร์สามารถวางไว้ก่อนหรือหลังเครื่องหมายปีกกา:

$sport1 = "จะ"; $sport2 = "เท้า"; echo "ฉันชอบ $(sport1)bol และ ($sport2)bol";

การต่อข้อมูล

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

ค่าประเภทใดๆ ที่ต่อกับสตริงจะถูกแปลงเป็นสตริงโดยปริยาย จากนั้นจึงต่อ:

"; echo "หมายเลข: " .1; ?>

วิธีที่ง่ายที่สุดในการกำหนดสตริงคือการใส่เครื่องหมายคำพูดเดี่ยว (อักขระ " ).

หากต้องการใช้เครื่องหมายคำพูดเดี่ยวภายในสตริง ให้หลีกด้วยเครื่องหมายแบ็กสแลช ( \ - หากคุณต้องการเขียนแบ็กสแลชเอง ให้ทำซ้ำ ( \\ - การใช้แบ็กสแลชอื่นๆ ทั้งหมดจะถูกตีความว่าเป็นอักขระปกติ ซึ่งหมายความว่าหากคุณพยายามใช้ลำดับหลีกอื่นๆ เช่น \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 = "ชื่อของฉัน" ; .
เสียงสะท้อน
ฉันชื่อ "$name" ฉันพิมพ์ $foo -> foo .
ตอนนี้ฉันกำลังอนุมาน
( $foo -> บาร์ [ 1 ])
?>

สิ่งนี้ควรแสดงอักษรตัวใหญ่ "A": \x41

อีโอที;

ฉันชื่อ "ชื่อของฉัน" ฉันพิมพ์ฟู ตอนนี้ฉันส่งออก Bar2 สิ่งนี้ควรแสดงอักษรตัวใหญ่ "A": A

นอกจากนี้ยังเป็นไปได้ที่จะใช้ไวยากรณ์ heredoc เพื่อส่งข้อมูลผ่านอาร์กิวเมนต์ของฟังก์ชัน:

ตั้งแต่เวอร์ชัน 5.3.0 เป็นไปได้ที่จะเริ่มต้นตัวแปรสแตติกและคุณสมบัติคลาส/ค่าคงที่โดยใช้ไวยากรณ์ Heredoc:
ตัวอย่าง #4 การใช้ Heredoc เพื่อเริ่มต้นตัวแปรคงที่
{
// ตัวแปรแบบคงที่<<ฟังก์ชั่นฟู()
$บาร์คงที่ =
}

ไม่มีอะไรที่นี่...
ฉลาก;
{
// คุณสมบัติคลาส/ค่าคงที่<<คลาสฟู
const บาร์ =

ตัวอย่างการใช้ค่าคงที่<<ฟูบาร์;
const บาร์ =
}
?>

สาธารณะ $baz =

ตัวอย่างการใช้สนาม

ใน PHP 5.3.0 คุณยังสามารถล้อมรอบตัวระบุ Heredoc ด้วยเครื่องหมายคำพูดคู่: โนว์ด็อก Nowdoc จะเหมือนกันสำหรับสตริงที่มีเครื่องหมายคำพูดเดี่ยว ในขณะที่ Heredoc ใช้สำหรับสตริงที่มีเครื่องหมายคำพูดคู่ Nowdoc คล้ายกับ Heredoc แต่อยู่ข้างใน

Nowdoc ถูกระบุด้วยลำดับเดียวกัน <<< ซึ่งใช้ใน heredoc แต่ตัวระบุต่อไปนี้อยู่ในเครื่องหมายคำพูดเดี่ยว เช่น <<<"EOT" - เงื่อนไขทั้งหมดที่ใช้กับตัวระบุ Heredoc ยังใช้กับ nowdoc ด้วย โดยเฉพาะเงื่อนไขที่ใช้กับตัวระบุการปิด

ตัวอย่าง #6 ตัวอย่าง Nowdoc

ตัวแปรได้รับการประมวลผล แต่คุณต้องระมัดระวังเมื่อใช้ตัวแปรที่ซับซ้อนภายใน Heredoc เช่นเดียวกับเมื่อทำงานกับสตริง<<<"EOD"
ข้อความตัวอย่าง
ทอดยาวหลายบรรทัด
ใช้ไวยากรณ์ nowdoc
ครอบคลุมหลายบรรทัด

/* ตัวอย่างที่ซับซ้อนยิ่งขึ้นพร้อมตัวแปร -
ฉลาก;
{
สาธารณะ $foo ;
สาธารณะ $บาร์ ;

var $foo ;
{
var $บาร์ ;
$นี่ -> bar = array("Bar1" , "Bar2" , "Bar3" );
}
}

$นี่ -> ฟู = "ฟู" ;
$นี่ ->

$foo = ใหม่ foo();<<<"EOT"
ฉันชื่อ "$name" ฉันพิมพ์ $foo->foo
ตอนนี้ฉันพิมพ์ ($foo->bar)
สิ่งนี้ไม่ควรแสดงตัวพิมพ์ใหญ่ "A": \x41
( $foo -> บาร์ [ 1 ])
?>

ผลลัพธ์ของการรันตัวอย่างนี้:

ฉันชื่อ "$name" ฉันพิมพ์ $foo->foo ตอนนี้ฉันพิมพ์ ($foo->bar) สิ่งนี้ไม่ควรแสดงตัวพิมพ์ใหญ่ "A": \x41

ความคิดเห็น:

ต่างจาก Heredoc ตรงที่ Nowdoc สามารถใช้ในบริบทใดก็ได้ที่มีข้อมูลคงที่ ตัวอย่างทั่วไปของการเริ่มต้นฟิลด์คลาสหรือค่าคงที่:

ตัวอย่าง #7 ตัวอย่างการใช้ข้อมูลคงที่

ตัวอย่างที่ 1 ตัวอย่างที่ไม่ถูกต้อง
คลาสฟู (<<<"EOT"
สาธารณะ $bar =
( $foo -> บาร์ [ 1 ])
}
?>

ความคิดเห็น:

เพิ่มการรองรับ nowdoc ใน PHP 5.3.0

การจัดการตัวแปร

หากระบุสตริงด้วยเครื่องหมายคำพูดคู่ หรือใช้ Heredoc ตัวแปรภายในจะถูกประมวลผล

ไวยากรณ์มีสองประเภท: ง่ายและซับซ้อน ไวยากรณ์แบบง่ายนั้นง่ายกว่าและสะดวกกว่า ทำให้สามารถประมวลผลตัวแปรซึ่งเป็นค่าอาร์เรย์ (อาร์เรย์ ) หรือคุณสมบัติของวัตถุ (วัตถุ

) โดยใช้ความพยายามน้อยที่สุด

ไวยากรณ์ที่ซับซ้อนสามารถระบุได้ด้วยเครื่องหมายปีกกาที่ล้อมรอบนิพจน์

ไวยากรณ์ง่ายๆ $ หากล่ามพบเครื่องหมายดอลลาร์ (

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

$juice = "แอปเปิ้ล" ;
echo "เขาดื่มน้ำผลไม้ $ นิดหน่อย" - PHP_EOL ;
// ใช้งานไม่ได้ "s" เป็นอักขระที่ถูกต้องสำหรับชื่อตัวแปร
// แต่ตัวแปรของเราชื่อ $juice
?>

ผลลัพธ์ของการรันตัวอย่างนี้:

echo "เขาดื่มน้ำผลไม้ที่ทำจากน้ำผลไม้ $" -

เขาดื่มน้ำแอปเปิ้ล เขาดื่มน้ำผลไม้ที่ทำจาก. ไวยากรณ์แบบง่ายนั้นง่ายกว่าและสะดวกกว่า ทำให้สามารถประมวลผลตัวแปรซึ่งเป็นค่าอาร์เรย์ (องค์ประกอบอาร์เรย์ ( ) หรือคุณสมบัติของวัตถุ () หรือคุณสมบัติของวัตถุ ( ] - ในดัชนีอาร์เรย์จะมีวงเล็บเหลี่ยมปิด (

) เป็นจุดสิ้นสุดของคำจำกัดความดัชนี

กฎเดียวกันนี้ใช้กับคุณสมบัติของวัตถุเช่นเดียวกับตัวแปรอย่างง่าย

ตัวอย่างที่ 8 ตัวอย่างไวยากรณ์อย่างง่าย
$juices = array("apple" , "orange" , "koolaid1" => "purple" );
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 "นี่คือ $( เยี่ยมมาก ) " ;
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 ())) " ;

เสียงสะท้อน "นี่คือค่าของตัวแปรตามชื่อที่ \$object->getName() ส่งกลับ:($( $object -> getName ())) " ;

// ใช้งานไม่ได้ ผลลัพธ์: นี่คือสิ่งที่ getName() ส่งคืน: (getName())
เสียงสะท้อน "นี่คือสิ่งที่ getName() ส่งคืน: (getName())";
?>

นอกจากนี้ยังสามารถเข้าถึงคุณสมบัติของอ็อบเจ็กต์ภายในสตริงโดยใช้ไวยากรณ์นี้ได้

ตัวอย่างที่ 1 ตัวอย่างที่ไม่ถูกต้อง
var $bar = "ฉันคือบาร์" -
}

$นี่ -> ฟู = "ฟู" ;
$บาร์ = "บาร์" ;
$baz = array("foo" , "bar" , "baz" , "quux" );
echo " ( $foo -> $bar ) \n" ;
echo " ( $foo -> $baz [ 1 ]) \n" ;
?>

ผลลัพธ์ของการรันตัวอย่างนี้:

ฉันคือบาร์ ฉันคือบาร์

ความคิดเห็น:

ฟังก์ชัน การเรียกเมธอด ตัวแปรคลาสแบบสแตติก และค่าคงที่คลาสทำงานภายใน {$} เริ่มต้นด้วย PHP 5 อย่างไรก็ตาม ค่าที่ให้มาจะถือเป็นชื่อตัวแปรในบริบทเดียวกับบรรทัดที่กำหนดไว้ {} การใช้เครื่องหมายปีกกาเดี่ยว (

- ตัวอย่างบางส่วน:
// แสดงข้อผิดพลาดทั้งหมด

) จะไม่ทำงานในการเข้าถึงค่าของฟังก์ชัน วิธีการ ค่าคงที่ของคลาส หรือตัวแปรคลาสแบบคงที่
คลาสเบียร์ (
const softdrink = "รูทเบียร์" ;
}

สาธารณะ $ale = "ipa" ;
$rootbeer = "เอ แอนด์ ดับบลิว" ;

$ipa = "อเล็กซานเดอร์ คีธ\"s" ;
// ใช้งานได้ ผลลัพธ์: ฉันต้องการ A&W

echo "ฉันต้องการ ($( เบียร์ :: softdrink )) \n" ;
// วิธีนี้ใช้ได้ผลเช่นกัน ผลลัพธ์: ฉันต้องการของ Alexander Keith
?>

echo "ฉันต้องการ ($( เบียร์ :: $ale )) \n" ;

การเข้าถึงและการเปลี่ยนอักขระในสตริง อักขระในสตริงสามารถใช้และแก้ไขได้โดยการระบุออฟเซ็ตจากจุดเริ่มต้นของสตริง โดยเริ่มต้นด้วยศูนย์ ในวงเล็บเหลี่ยมหลังสตริง เช่น $strและ คิดว่าสตริงสำหรับจุดประสงค์นี้เป็นอาร์เรย์ของอักขระ.

ความคิดเห็น: หากคุณต้องการรับหรือแทนที่อักขระมากกว่า 1 ตัว คุณสามารถใช้ฟังก์ชันได้

ความสนใจ

ซับสเตร() substr_replace()อักขระในสตริงสามารถเข้าถึงได้โดยใช้เครื่องหมายปีกกา เช่น $str(42) substr_replace()การพยายามเขียนออฟเซ็ตที่เกินขอบเขตของบรรทัดจะทำให้สตริงมีช่องว่างจนถึงออฟเซ็ตนั้น ประเภทที่ไม่ใช่จำนวนเต็มจะถูกแปลงเป็นประเภทจำนวนเต็ม

ความสนใจ

ประเภทออฟเซ็ตที่ไม่ถูกต้องจะทำให้เกิดข้อผิดพลาดระดับ

E_ประกาศ

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

// รับอักขระตัวที่สามของสตริง
$สาม = $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) . -
?>

อย่าคาดหวังว่าจะได้รับโค้ดของอักขระโดยการแปลงเป็นจำนวนเต็ม (ดังที่ทำเสร็จแล้ว เช่น ใน 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: ในกรณีนี้ สามารถเขียนสคริปต์ในการเข้ารหัสใดๆ (ไม่ว่าจะระบุอย่างชัดเจนหรือกำหนดโดยอัตโนมัติ) จากนั้นแปลงเป็นการเข้ารหัสภายในเฉพาะ ซึ่งจะใช้ในภายหลังสำหรับ ตัวอักษรสตริง

แน่นอนว่า เพื่อให้เป็นประโยชน์ ฟังก์ชันสตริงจะต้องตั้งสมมติฐานบางประการเกี่ยวกับการเข้ารหัสสตริง น่าเสียดายที่ฟังก์ชัน PHP มีแนวทางแก้ไขปัญหานี้ค่อนข้างหลากหลาย:

  • ฟังก์ชันบางอย่างถือว่าสตริงถูกเข้ารหัสในการเข้ารหัสแบบไบต์เดี่ยวบางรายการ แต่ไม่จำเป็นต้องตีความไบต์เป็นอักขระเฉพาะเพื่อให้ทำงานได้อย่างถูกต้อง อักขระในสตริงสามารถใช้และแก้ไขได้โดยการระบุออฟเซ็ตจากจุดเริ่มต้นของสตริง โดยเริ่มต้นด้วยศูนย์ ในวงเล็บเหลี่ยมหลังสตริง เช่น $str, หมวดหมู่นี้รวมถึง ตัวอย่างเช่น, สตรอส()สเตรน() และ strcmp()
  • - วิธีคิดอีกวิธีหนึ่งเกี่ยวกับฟังก์ชันเหล่านี้ก็คือ ทำงานบนบัฟเฟอร์หน่วยความจำ เช่น ทำงานโดยตรงกับไบต์และออฟเซ็ต
  • ชดเชย ฟังก์ชันอื่นๆ คาดว่าการเข้ารหัสจะถูกส่งผ่านเป็นพารามิเตอร์ บางทีอาจถือว่าการเข้ารหัสเริ่มต้นบางอย่างหากไม่ได้ระบุพารามิเตอร์ที่มีการเข้ารหัส ฟังก์ชั่นนี้คือสุดท้ายนี้ มีฟังก์ชันที่ถือว่าสตริงใช้การเข้ารหัสเฉพาะ ซึ่งปกติจะเป็น UTF-8 ฟังก์ชันส่วนใหญ่จากส่วนขยาย intl และ PCRE จะอยู่ที่นี่ (ในกรณีหลัง เฉพาะเมื่อระบุตัวแก้ไขเท่านั้น คุณ- แม้ว่าสิ่งนี้จะทำโดยตั้งใจ แต่ฟังก์ชั่น utf8_decode()หมายถึงการเข้ารหัส UTF-8 และ

utf8_encode()

- ISO-8859-1.

ท้ายที่สุดแล้ว การเขียนโปรแกรมที่ถูกต้องซึ่งทำงานกับ Unicode หมายถึงการหลีกเลี่ยงฟังก์ชันที่ไม่ทำงานกับ Unicode อย่างระมัดระวังและมีแนวโน้มที่จะทำให้ข้อมูลเสียหาย และใช้ฟังก์ชันที่ถูกต้องแทน ซึ่งโดยปกติจะมาจากส่วนขยาย intl และ mbstring

อย่างไรก็ตาม การใช้ฟังก์ชันที่รองรับ Unicode ถือเป็นการเริ่มต้นที่ดี ไม่ว่าภาษานั้นจะมีคุณสมบัติอะไรก็ตาม จำเป็นต้องทราบคุณสมบัติของ Unicode เอง ตัวอย่างเช่น หากโปรแกรมสันนิษฐานว่าในภาษานั้นมีเพียงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่เท่านั้น ก็ถือว่าเกิดข้อผิดพลาดใหญ่

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

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

วิธีที่ง่ายที่สุดในการกำหนดสตริงคือการใส่เครื่องหมายคำพูดเดี่ยว (") หากต้องการใช้เครื่องหมายคำพูดเดี่ยวภายในสตริงที่มีเครื่องหมายคำพูดเดี่ยว เครื่องหมายเหล่านั้นจะต้องนำหน้าด้วยเครื่องหมายแบ็กสแลช (\) นั่นคือเป็น Escape หากเครื่องหมายแบ็กสแลชต้องมา ก่อนเครื่องหมายคำพูดเดี่ยวหรืออยู่ท้ายบรรทัด คุณต้องทำซ้ำเครื่องหมายดังกล่าว หากคุณพยายามหลีกเลี่ยงอักขระอื่นๆ เครื่องหมายแบ็กสแลชจะถูกพิมพ์ด้วย

นี่คือตัวอย่างการใช้เครื่องหมายคำพูดเดี่ยว:
// เอาท์พุต: สตริงอย่างง่าย
echo "สตริงธรรมดา";
// พิมพ์: ฉันอยู่ที่นี่
echo "ฉันอยู่ที่นี่";
// ผลลัพธ์: สิ่งนี้จะไม่แทรก: \n บรรทัดใหม่
echo "สิ่งนี้จะไม่แทรก:\nnewline";
// ผลลัพธ์: ตัวแปร $example จะไม่ถูกแทนที่เช่นกัน
echo "ตัวแปร $example จะไม่ถูกแทนที่เช่นกัน";

หากสตริงอยู่ในเครื่องหมายคำพูดคู่ (") PHP จะจดจำลำดับการหลีกเลี่ยงเพิ่มเติมสำหรับอักขระพิเศษและยังแทนที่ชื่อตัวแปรลงในสตริงด้วยค่าของมัน เช่นเดียวกับเครื่องหมายคำพูดเดี่ยวเพื่อใช้เครื่องหมายคำพูดคู่ภายในสตริงที่อยู่ใน เครื่องหมายคำพูดคู่จะต้องนำหน้าด้วยอักขระแบ็กสแลช (\)
// เอาท์พุต: สตริงอย่างง่าย
echo "สตริงธรรมดา";
นี่คือตัวอย่างการใช้เครื่องหมายคำพูดคู่:
// ผลลัพธ์: บริษัท "Snowdrop"
echo "บริษัท \"สโนว์ดรอป\"";
// ผลลัพธ์: สิ่งนี้จะนำไปสู่การขึ้นบรรทัดใหม่
echo "คำสั่งนี้จะขึ้นบรรทัดใหม่ \n";
// ผลลัพธ์: ตัวแปรจะถูกแทนที่
$example = "จะถูกแทนที่";

เรามาดูกันว่าราคาเดี่ยวเร็วกว่าราคาคู่มากแค่ไหน สำหรับการวัด เราจะเขียนสคริปต์ทดสอบสั้นๆ และเราจะทราบทันทีว่าหากคุณทดสอบด้วยตัวเอง ผลลัพธ์ซึ่งขึ้นอยู่กับฮาร์ดแวร์ของพีซีหรือเซิร์ฟเวอร์ของคุณจะแตกต่างออกไป
// ส่งคืนการประทับเวลาที่จุดเริ่มต้นของการวนซ้ำ
$start = ไมโครไทม์(จริง);
// สร้างลูปสำหรับการวนซ้ำ 1 ล้านครั้ง
สำหรับ ($i = 0; $i< 1000000; $i++) {
$text = "นี่คือสตริงอักขระ";
}
// คำนวณเวลาที่ใช้
$time = (ไมโครไทม์(จริง) - $เริ่มต้น);

ผลลัพธ์: 0.09 วินาที
หากเราแทนที่เครื่องหมายคำพูดเดี่ยวด้วยเครื่องหมายคำพูดคู่:

$text = "นี่คือสตริงอักขระ";
ผลลัพธ์จะเป็น 0.10 วินาที
อย่างที่คุณเห็น เมื่อใช้สตริงข้อความ เวลาดำเนินการต่างกันน้อยมาก และอาจกล่าวได้ว่าไม่มีเลยด้วยซ้ำ ความสนุกเริ่มต้นขึ้นเมื่อเราพยายามรวมสตริงและตัวแปรเข้าด้วยกัน

$text = "นี่คือสายอักขระ $i";

หรือ

$text = $i"นี่คือสตริงอักขระ";

ผลลัพธ์ประมาณ: 0.27 วินาที

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

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

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

ลองพิจารณางานเล็กๆ น้อยๆ ในการแสดงตัวแปรเป็นส่วนหนึ่งของข้อความ รวมถึงการใช้โค้ด html

$วันที่"; ?>

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

".$วันที่""; ?>

โดยปกติคุณต้องปฏิบัติตามกฎนี้ (ใส่ทุกสิ่งที่ไม่จำเป็นต้องแยกวิเคราะห์ด้วยเครื่องหมายคำพูดเดี่ยว) ไม่เพียงแต่เมื่อแสดงข้อความ แต่ยังเมื่อกำหนดค่าให้กับตัวแปรสตริงด้วย:

หรือ ตัวอย่างเช่น เมื่อใช้สตริงเมื่อส่งผ่านอาร์กิวเมนต์ของฟังก์ชัน:

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