การใช้ <? = tag ใน PHP เป็นเรื่องที่ผิดหรือไม่?


189

ฉันเพิ่งเจอแท็ก PHP <?= ?>นี้เมื่อเร็ว ๆ นี้และฉันลังเลที่จะใช้ แต่มันก็ยากที่ฉันต้องการให้คุณทำ ฉันรู้ว่ามันคือการปฏิบัติที่ดีที่จะใช้แท็กสั้น<? ?>และว่าเราควรจะใช้แท็กเต็มรูปแบบ<?php ?>แทน แต่สิ่งที่เกี่ยวกับเรื่องนี้อย่างใดอย่างหนึ่ง: <?= ?>?

มันจะประหยัดการพิมพ์บางส่วนและมันจะดีกว่าสำหรับการอ่านรหัส IMO ดังนั้นแทนที่จะเป็นเช่นนี้:

<input name="someVar" value="<?php echo $someVar; ?>">

ฉันสามารถเขียนแบบนี้ได้ซึ่งสะอาดกว่า:

<input name="someVar" value="<?= $someVar ?>">

การใช้โอเปอเรเตอร์นี้ขมวดคิ้วอยู่หรือไม่?


11
ปัญหาของคำถามประเภทนี้คือมันให้ความเห็น มี "เทคนิค" ไม่ใช่วิธีที่ถูกหรือผิด บางคนโต้แย้งว่าบางคนต่อต้านความชอบทั้งหมดของมัน ดังนั้นในที่สุดมันก็ขึ้นอยู่กับคุณ
mseancole

หลีกเลี่ยงแท็กปิดในรูปแบบใด ๆ ถ้าคุณสามารถ - เช่นไฟล์ที่มีรหัส php เท่านั้น (ไม่มี HTML ฯลฯ ) หากคุณมีแท็กปิดอักขระใด ๆ หลังจากนั้นจะถูกส่งออกไปยังเบราว์เซอร์ (สำหรับเว็บแอป) - ซึ่งอาจทำให้ยากมากในการแก้ปัญหา สำหรับข้อมูลเพิ่มเติม: stackoverflow.com/a/4453835/49560
dharm0us

ไม่เกี่ยวข้องกับความคิดเห็น: ระวังเพราะechoนำไปสู่ ​​XSS ได้ง่ายมากและคุณควรพึ่งพาวิธีการสะท้อนบริบทโดยเฉพาะ (เช่น: มีfunction html($x) { echo htmlentities($x,...); }และยกเลิกhtml($someVar);แทนที่จะecho $someVarใช้หรือใช้echo json_encode($x);สำหรับบริบท JS) สิ่งนี้ทำให้<?=แท็กเป็นแนวปฏิบัติที่ไม่ดีเพราะนั่นหมายความว่าคุณมีเนื้อหาตัวแปร HTML ที่ใช้ Escape ในที่อื่นและเพื่อให้สถานที่อื่น ๆ ต้องรู้ว่าตัวแปรนี้ต้องใช้ HTML อย่างน่าอัศจรรย์เพราะมันดังก้องในบริบท HTML
Xenos

คำตอบ:


209

ประวัติศาสตร์

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

ปัญหาหลักที่มีแท็กสั้น PHP คือว่า PHP การจัดการเพื่อเลือกแท็ก ( <?) ที่ถูกใช้โดยไวยากรณ์อีกXML

เมื่อเปิดใช้งานตัวเลือกคุณจะไม่สามารถส่งออกการประกาศ xml แบบ raw โดยไม่ได้รับข้อผิดพลาดทางไวยากรณ์:

<?xml version="1.0" encoding="UTF-8" ?>

นี่เป็นปัญหาใหญ่เมื่อคุณพิจารณาว่าการแยกวิเคราะห์และการจัดการ XML ทั่วไปเป็นอย่างไร

เกี่ยวกับ<?=อะไร

แม้ว่า<?ความขัดแย้งกับสาเหตุ XML, ไม่ได้<?= น่าเสียดายที่ตัวเลือกในการสลับเปิดและปิดนั้นเชื่อมโยงกับshort_open_tagซึ่งหมายความว่าเพื่อให้ได้ประโยชน์จากแท็ก echo สั้น ( <?=) คุณต้องจัดการกับปัญหาของแท็กเปิดสั้น ( <?) ประเด็นที่เกี่ยวข้องกับแท็กเปิดสั้น ๆ ได้มากขึ้นกว่าผลประโยชน์จากแท็กก้องสั้นดังนั้นคุณจะพบล้านบาทและมีข้อเสนอแนะครึ่งที่จะเปิดshort_open_tagออกที่คุณควร

ด้วย PHP 5.4 อย่างไรก็ตามแท็ก echo สั้น ๆ นั้นถูกเปิดใช้งานแยกต่างหากจากshort_open_tagตัวเลือก ฉันเห็นสิ่งนี้เป็นการรับรองโดยตรงของความสะดวกสบายของ<?=เนื่องจากไม่มีอะไรผิดปกติกับมันในและของตัวเอง

ปัญหาคือคุณไม่สามารถรับประกันได้ว่าคุณจะได้รับ<?=หากคุณพยายามเขียนโค้ดที่สามารถทำงานได้ในเวอร์ชัน PHP ที่กว้างขึ้น

ตกลงดังนั้นตอนนี้ที่ทั้งหมดออกไป

คุณควรใช้<?=?

แผนผังลำดับงานเกี่ยวกับว่าจะใช้แท็ก echo สั้น ๆ หรือไม่


70
ฉันไม่เห็นด้วยกับแผนภาพเร็วของคุณ คำตอบที่ถูกต้องคือ99.99% YESเนื่องจากสภาพแวดล้อมการผลิตส่วนใหญ่ได้รับการกำหนดค่าให้ใช้แท็กสั้น ๆ เผื่อว่าคุณพัดมันและพวกเขาลบ<?=ในอนาคตคุณสามารถแก้ไขได้ในเวลาน้อยกว่านาทีไม่ว่ากี่พันไฟล์ใช้งานได้เพียงแค่คุณทำการค้นหาโครงการกว้างและแทนที่สำหรับ<?= <?php echo คำตอบของฉันคือไม่ต้องกังวลและเพียงแค่ใช้ประโยชน์ outweight อย่างมากผลที่ตามมา <?=ไม่ถือว่าเป็นแท็กสั้น ๆ อีกต่อไป Rasmus Lerdorf ตัวเขาเองทำอย่างนั้น
dukeofgaming

32
@dukeofgaming คุณได้รับข้อมูลเกี่ยวกับสภาพแวดล้อมการผลิตที่กำหนดค่าให้ใช้แท็กสั้น ๆ ที่ไหน การปิดใช้งานเป็นหนึ่งในการกำหนดค่าที่แนะนำมากที่สุดที่ฉันเคยได้ยินเกี่ยวกับการปิดการใช้งานคำพูดมายากล นอกจากนี้ยังไม่มีเหตุผลที่จะมีสภาพแวดล้อมแบบ dev ที่แตกต่างจากการผลิต
zzzzBov

4
แท็กสั้น ๆ ถูกเปิดใช้งานโดยค่าเริ่มต้นจนถึง 5.3 php.net/manual/en/ini.core.php#ini.short-open-tagบริการโฮสติ้งส่วนใหญ่ที่ฉันรู้จักสนับสนุนโดยไม่มีปัญหาและนี่เป็นหนึ่งในเหตุผลของกรอบ Kohana ใช้เพื่อส่งเสริมให้มัน <?=จะเปิดอยู่เสมอ ( stackoverflow.com/a/6064813/156257 ) และใช้เวลาส่วนใหญ่ในการเปิด คุณสามารถพิสูจน์ฉันผิดโดยการตรวจสอบกับโฮสต์ของคุณถ้า: พวกเขาถูกปิดใช้งานและใช้ PHP <5.3 และหากพวกเขาไม่อนุญาตให้ผู้ใช้หรือการตั้งค่าถูกแทนที่โดยคำขอพิเศษ; <?=ถ้าก่อนหน้านี้ทั้งหมดเป็นเท็จโดยวิธีการทั้งหมดต้องกังวลเกี่ยวกับ
dukeofgaming

6
คุณไม่ได้กังวลว่า<?=จะถูกลบออกและไม่พ่ะย่ะค่ะอื่น ๆ <?=อาจจะมีและถ้าพวกเขาที่พวกเขาไม่จำเป็นต้องใช้ บางคนมีความกลัวอย่างไม่มีเหตุผลในการใช้คุณสมบัติภาษาบางอย่าง ( เช่นการปิดแท็กปิดใน php )
zzzzBov

8
นั่นเป็นจุดของฉันได้อย่างแม่นยำ: ไม่มีความจำเป็นที่จะต้องกังวล ฉันแค่จะใส่ "คุณเป็นห่วง?" - ใช่ -> "ไปข้างหน้าและใช้มันไม่จำเป็นต้องกังวล" นอกจากนี้ยังให้ความรู้สึกเหมือนคุณกำลังแสดงให้เห็นว่าการปิดแท็กปิดเป็นการปฏิบัติที่ไม่ดีซึ่งไม่ใช่
dukeofgaming

28

ปัดหมวก PHP ของฉันออก

ฉันชอบการใช้<?= $someVar ?>verbose มากกว่าecho(เป็นการตั้งค่าส่วนตัว) เพียง AFAIK ข้อเสียคือสำหรับผู้ใช้ที่กำลังทำงานอยู่ก่อน 5.4.0 ซึ่งในกรณีนี้short_open_tagจะต้องถูกเปิดใช้งานในphp.ini

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


1
Nitpick: แม้ว่า<?=จะไม่ได้รับผลกระทบจากshort_open_tagบน PHP 5.4 แต่<?ก็ยังเป็นเช่นนั้นและถ้าคุณมีนิสัยชอบใช้แท็กแบบสั้น ๆ มันค่อนข้างง่ายที่จะลืมสิ่งที่รองรับในเวอร์ชันใด
yannis

7
@YannisRizos เป็นเรื่องดีที่จะแยกความแตกต่าง<?=ว่า "ฉันกำลังส่งออกตัวแปรตอนนี้" สำหรับการใช้งานสไตล์เทมเพลตและ<?php"ฉันกำลังใช้งานโค้ดจำนวนมากในตอนนี้" ฉันขอแนะนำว่าอย่าใช้<?แต่ทั้งคู่<?=และ<?phpใช้ได้ดี
Izkata

2
+1 เนื่องจาก Rasmus Lerdorf รับรองแท็กชวเลข <? = ฉันดูหนึ่งในคำปราศรัยของเขาใน PHP 5.4 นั่นคือเหตุผลที่ตั้งแต่ PHP 5.4.0 แท็ก <? = มีให้ใช้งานเสมอ ฉันเห็นรหัสก่อน PHP 5.4 จำนวนมากที่ใช้แท็ก <? = ในแอปพลิเคชัน View of MVC แต่ใช้ <? php ... ?> ในไฟล์ที่ไม่ใช่มุมมอง
โปรแกรมเมอร์

@ Jason นั่นไม่ใช่สิ่งที่ฉันพูด "ราสมุสรับรองฟู" ไม่ใช่การโต้เถียง "ราสมุสรับรองฟูด้วยเรื่องนี้และเหตุผลนั้น" อย่างไรก็ตามก็คือ
yannis

2
@ Yanis Rizos "Rasmus รับรอง foo สำหรับเรื่องนี้และเหตุผลนั้น" อย่างไรก็ตามคือ ขอบคุณสำหรับการปกครอง แต่เหตุผลของฉันคือเนื่องจาก Rasmus Lerdorf รับรองเป็นผู้สร้างภาษาและยังคงมีอิทธิพลต่อการพัฒนาของ PHP มีการเปลี่ยนแปลงเพื่อให้แท็ก <? = ใช้ได้เสมอ นี่คือสิ่งที่ฉันควรเพิ่มไว้ในความคิดเห็นดั้งเดิมของฉัน "ดังนั้นการใช้ <? = ในมุมมองจะกลายเป็นที่แพร่หลายมากขึ้น" แดงฉันจะต้องตรวจสอบความคิดเห็นของฉันสามครั้งในตอนนี้ ... จุด ...
โปรแกรมเมอร์

21

แน่นอนคุณควรพยายามหลีกเลี่ยงการแท็กแบบสั้น ๆ ไม่ว่าจะเป็นหรือ<?<?=

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

มันจะประหยัดการพิมพ์บางส่วนและมันจะดีกว่าสำหรับการอ่านรหัส IMO

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

<input name="someVar" value="{someVar}">

สามารถอ่านได้มากขึ้นจากทั้งตัวอย่างของคุณ

สุดท้ายก็เป็นที่น่าสังเกตว่าแท็กแบบสั้น ๆ เป็นกำลังใจอย่างชัดเจนโดยโครงการ PHP ที่สำคัญเช่นลูกแพร์และกรอบ Zend


14
+1 สำหรับเทมเพลต -1 สำหรับการพกพา มันเป็นภาษาฝั่งเซิร์ฟเวอร์ ความท้าทายที่คุณต้องให้ความสำคัญสำหรับเซิร์ฟเวอร์นั้นเป็นสิ่งที่ต้องการความยืดหยุ่นและความปลอดภัย มันจะเป็นความคิดที่ไม่ดีอย่างน่าอัศจรรย์ที่จะลงทุนเวลาอย่างจริงจังเพื่อให้แน่ใจว่ามันจะทำงานบนหลายแพลตฟอร์ม ... (ในกรณี!) ...
riwalk

3
@ Stargazer712 หืมมม? สิ่งเดียวที่คุณต้องทำคือใช้มาตรฐาน<?phpและechoแทนที่จะเป็น<?และ<?=คุณนับว่าเป็นเวลาที่ร้ายแรงหรือไม่? และจะเกิดอะไรขึ้นเมื่อคุณย้ายโปรเจ็กต์ของคุณไปยังเซิร์ฟเวอร์ที่ปิดการใช้งานแท็กสั้นด้วยเหตุผลบางอย่าง
yannis

13
@ ยานนิส: ตัวละครไม่กี่ตัวนั้นอาจดูเหมือนไม่มากนัก แต่ IMO พวกมันมีเสียงรบกวนมาก
วินไคลน์

8
ฉันคิดว่ามันควรจะกล่าวว่าวัตถุประสงค์เดิมของ PHP จะเป็นภาษาแม่แบบ การเพิ่มเทมเพลตเอนจิ้นอีกอัน (bloat เพิ่มเติม) ที่ด้านบนของ PHP ไม่ลอยเรือทูน่าของฉัน เพียงปฏิบัติตามแนวทางปฏิบัติที่ดี (เคล็ดลับที่ดีอยู่ที่นี่stackoverflow.com/questions/62617/… ) เมื่อการเข้ารหัส PHP ผสมกับ HTML และคุณพร้อมที่จะไป
โปรแกรมเมอร์

2
@Yannis Rizos ใช่ควรมีการกล่าวถึงเพราะผู้ที่เพิ่งเริ่มใช้ PHP อาจคิดว่าพวกเขามีหน้าที่ต้องใช้เครื่องมือแม่แบบ [whizbang] ในโครงการ PHP ของตนโดยไม่พิจารณาใช้ PHP บริสุทธิ์แทน ฉันควรจะทำการประมวลผลข้อความใน Perlหรือไม่ แต่ฉันคิดว่าตอนนี้ Perl ค่อนข้างดีที่การประมวลผลข้อความ - เช่นเดียวกับ PHP และ templating
โปรแกรมเมอร์

15

PHP-เอกสารอย่างชัดเจนบอกว่าคุณสามารถใช้แท็กก้องสั้นได้อย่างปลอดภัย:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

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


10

เหตุผลในการใช้แท็กสั้น ๆ :

  • มันสั้นกว่า

เหตุผลที่ไม่ใช้แท็กสั้น ๆ :

  • พวกเขาแนะนำการกำหนดค่า gotcha อีกหนึ่ง - ในขณะที่คุณควบคุมเซิร์ฟเวอร์เกือบตลอดเวลาในบริบทของมืออาชีพถ้าคุณวางแผนที่จะปล่อยรหัสของคุณให้กับประชาชนทั่วไปแท็กสั้น ๆ อาจแตกสลายไม่ได้สำหรับคนที่ใช้งาน .
  • พวกมันทำให้มันง่ายเกินไปที่จะปล่อยสตริงที่ไม่ถูกสุขลักษณะลงในเอาต์พุตของคุณ สิ่งนี้น่ากลัวเพราะอาจแนะนำช่องโหว่ของ XSS ในขณะที่แท็กยาวทำอะไรโดยตรงเพื่อป้องกันไม่ให้พวกเขาไม่ส่งสัญญาณไปยังโปรแกรมเมอร์ว่าบางทีสิ่งที่พวกเขากำลังทำไม่ได้เป็นสิ่งที่ถูกต้องและพวกเขาควรจะเริ่มต้นใช้ระบบแม่แบบที่จะจัดการกับ HTML เข้ารหัสสำหรับพวกเขาในขณะนี้ การแสดงผลสตริงแบบไดนามิกที่มีแท็กยาวเป็นสิ่งที่เจ็บปวดซึ่งเป็นสิ่งที่ดี (ให้ความรู้)

นั่นคือคำตอบที่จะยอมรับ IMO แม้ว่าแม่แบบแม่แบบจะไม่ทำให้ทุกอย่างปลอดภัย XSS (ข้อมูลผู้ใช้ในแอตทริบิวต์ src ของสคริปต์จะไม่ปลอดภัยเสมอ) และฉันไม่รู้ว่ากลไกแม่แบบนั้นตระหนักถึงบริบทการสะท้อนที่เหมาะสมหรือไม่ จะทำอย่างไรถ้าตัวแปร PHP สิ้นสุดลงในเนื้อหาแท็กสคริปต์ ใน SVG ฝังใน HTML หรือไม่
Xenos

@ Xenos ชัดเจนขึ้นอยู่กับระบบแม่แบบที่มีปัญหาและไม่มีสัญลักษณ์แสดงหัวข้อย่อยเงิน แต่ส่วนใหญ่จะลดพื้นผิวบั๊กและจำนวนสถานการณ์ที่ต้องใช้ความขยันด้วยตนเอง (แหล่งความปลอดภัยที่สำคัญที่สุดเพียงแหล่งเดียว) "อย่าใส่เนื้อหาแบบไดนามิกในแท็กสคริปต์" ง่ายต่อการติดตาม (และตรวจสอบ) กว่า "ตรวจสอบให้แน่ใจว่าเนื้อหาแบบไดนามิกทั้งหมดได้รับการเข้ารหัส HTML อย่างถูกต้องทุกที่"
tdammers

4

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

มันดีกว่า<? echo($x); ?>ทุกหนทุกแห่งอย่างแน่นอน

ระยะยาวคุณอาจต้องการที่จะมองเข้าไปในเครื่องยนต์ templating เช่นSmarty


3
Smarty ครั้งหนึ่งเคยเป็นแม่แบบเครื่องยนต์ แต่ตอนนี้มันเป็นระเบียบที่ล้าสมัยและป่องและคุณควรคัดท้ายชัดเจน
yannis

2

ตั้งแต่ PHP 7.4 สนามเด็กเล่นเปลี่ยนไปเล็กน้อย:

<? ?> เลิกใช้อย่างเป็นทางการและจะถูกลบใน PHP 8.0

PHP RFC: เลิกใช้แท็กสั้น PHP เปิดระบุอย่างชัดเจน<?= ?>ว่าไม่ได้รับผลกระทบ สิ่งนี้จะบ่งบอก (ตามฉันไม่ใช่ RFC) ว่าการใช้งานไม่ได้หมดกำลังใจ


-3

พูดตามตรงฉันคิดว่าการสะท้อนผลลัพธ์ไม่ว่าวิธีการนั้นเป็นอย่างไร (แบบเก่าหรือใหม่) เป็นสิ่งที่ล้าสมัยในขณะที่ MVC ฉลอง 33 ปีแล้ว

ฉันจะบอกว่าใช่นี่เป็นวิธีปฏิบัติที่ดีในการห่อหุ้มข้อมูลเซิร์ฟเวอร์ขาเข้า (php) ภายในเอกสาร XML และดำเนินการในชั้นการสมัคร / ลูกค้าของคุณดังนั้นช่วยให้คุณประหยัดได้แม้กระทั่งความคิดในการใช้แท็กดังกล่าว


1
อันที่จริง MVC เฉลิมฉลอง 33 ปีมันเป็นครั้งแรกในเดือนธันวาคม 2522 ในบทความนี้
yannis

ใช่ฉันยังอยู่ในปี 2000 ความผิดพลาดของฉัน :-)
sebas

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