สิ่งใดดีกว่า: รวม HTML ไว้ในโค้ด PHP หรือภายนอก?


28

ดูนี่สิ:

<?php
echo "Hello World";
?>
<br />
<?php
echo "Welcome";
?>

และตอนนี้ดูที่นี่:

<?php
echo "Hello World";
echo "<br />";
echo "Welcome";
?>

ตัวอย่างใดในตัวอย่างข้างต้นที่มีการพิจารณาว่าดีกว่า (อย่างน้อยจากมุมมองประสิทธิภาพ)

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


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

1
@delnan - คุณควรพิจารณาการโพสต์ว่าเป็นคำตอบในรูปแบบขยายเล็กน้อย นั่นสะอาดกว่าเยอะ
jmort253

@ jmort253 พิจารณาแล้ว แต่ฉันมีความรู้เกี่ยวกับ PHP น้อยมากดังนั้นฉันจึงไม่สามารถพูดถึงแนวทางปฏิบัติที่ดีที่สุดในโลก PHP ได้

คุณพยายามแก้ไขปัญหาอะไร
Jim G.

ในแง่ของประสิทธิภาพมันไม่สำคัญ เครือข่ายช้ากว่ามากเมื่อเปรียบเทียบ ต้นทุนการโอนสูงขึ้นอย่างมีนัยสำคัญจึงทำให้ค่าใช้จ่ายในการสร้างไม่มีนัยสำคัญเมื่อเปรียบเทียบ
Martin York เมื่อ

คำตอบ:


23

เทมเพลตควรทำโดยเทมเพลต แต่ถ้าเพียงสองทางเลือกของคุณก็เป็นไปได้ กรณีที่ 1 จะดีกว่า นี่เป็นแนวคิดเดียวกันกับ Android inflating layout โดย xml หรือสร้าง UI แบบเป็นโปรแกรม คุณ<br/>เป็นเนื้อหาแบบคงที่จาก html ของคุณและเซิร์ฟเวอร์ของคุณทั้งหมดจะทำเพื่อแสดงมัน แต่ถ้าคุณใช้ php เพื่อดำเนินการสิ่งนี้จะเป็นการใช้ทรัพยากรเซิร์ฟเวอร์ของคุณและกำลังประมวลผล

นี่คือวิธีที่ควรทำ: index.php:

<?php
include 'header.html';
...
include 'footer.html';  
?>  

header.html และ footer.html เป็นแม่แบบ


1
ฉันได้อ่านหนังสือสำหรับ Kevin Yank ซึ่งเป็น "PHP & MySQL Novice to Ninja" เกี่ยวกับสิ่งที่เรียกว่าตัวควบคุมและเทมเพลต สิ่งเหล่านี้เป็นสิ่งเดียวกันกับที่คุณบอกฉันหรือแตกต่างกันหรือไม่? หากพวกเขาเหมือนกันว่าการวางโค้ดในไฟล์ต่างๆจะทำให้ดีขึ้นได้อย่างไร
rashed

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

อะไรคือเหตุผลหลักที่อยู่เบื้องหลัง ถ้าเราไม่ทำอย่างนั้นล่ะ เราจะเสียอะไร
rashed

ให้ดูที่นี้ นี่คือความคิดเห็นที่ 4 ของคำตอบนี้ หากคุณดูหน้านี้ในแหล่งที่มาตอนนี้คุณจะเห็น "<div> <span ... > ... </span> <a ... > ... </a>" "การถ่ายภาพมือเขียนโค้ดความคิดเห็นที่ 4000 เป็นไปได้ไหม หรือเพียงแค่ทำให้มันเป็นเทมเพลตและให้เซิร์ฟเวอร์ของคุณ 'เพิ่ม' สิ่งนี้เมื่อมันต้องการ
wtsang02

1
เช่นกัน @wtsang คุณไม่เพียง แต่มีตัวเลือกสองตัวเท่านั้นคุณยังมีตัวเลือกที่สามเรียกใช้ (หรือเรียนรู้) เสมอ
ocodo

54

หากต้องการตอบคำถามของคุณโดยตรง: ไม่ต้องสะท้อนข้อความหรือ HTML ปล่อยให้อยู่นอก PHP ของคุณ

<?php echo "<p>Hello World</p>"; // Alway wrong. ?>

<p>Hello World</p>  <!-- Does the same thing, faster, and is more readable. -->

การหลบหนีไปที่ PHP นั้นเป็นการสูญเปล่าหากสิ่งที่คุณต้องทำคือส่งผ่านข้อความคงที่หรือ html คงที่ โค้ดภายในทั้งหมด<?php ?>จะถูกส่งไปยัง PHP เพื่อทำการตีความ ซึ่งหมายความว่าเว็บไซต์ของคุณช้าลงและคุณกำลังสูญเสียไฟฟ้าหากคุณส่งข้อความคงที่ไปยัง PHP จำนวนมากโดยไม่มีเหตุผล (บางครั้งก็มีเหตุผล)

วิธีปฏิบัติที่ดีที่สุดคือการมีตรรกะและทำเสียงฮึดฮัดของคุณในไฟล์ที่ไม่มี HTML ใด ๆ เพียง PHP

วิธีที่ฉันชอบทำคือใช้กรอบ MVC ฉันมี PHP บริสุทธิ์ในรูปแบบและตัวควบคุมและส่วนผสมของ HTML และ PHP ในมุมมอง คุณไม่ต้องการกรอบ MVC คุณสามารถผสาน HTML ของคุณลงในไฟล์เทมเพลตซึ่งคุณรวมไว้ในไฟล์ PHP ล้วนๆ

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

โชคดีที่ PHP มาพร้อมกับเครื่องมือที่เป็นมิตรเพื่อให้ PHP อ่านง่ายขึ้นเมื่อผสมกับ html

ไวยากรณ์ทางเลือก

แนวทางปฏิบัติที่ดีที่สุดคือการใช้ไวยากรณ์ PHP ปกติเมื่อเขียน PHP บริสุทธิ์ แต่เป็นไวยากรณ์ทางเลือกเมื่อผสม PHP และ HTML

ในไฟล์ PHP ปกติโดยไม่มี HTML:

if ($something) {
  do_something(); // do_something() shouldn't echo or print.
}

นี่เป็นสิ่งที่สวยงามสำหรับ PHP ที่บริสุทธิ์ แต่ไม่เหมาะเมื่อหนีออกจาก HTML โดยเฉพาะอย่างยิ่งการจัดฟันปิดมักจะยากที่จะเข้าใจเมื่อพวกเขาแสดงในกองใหญ่ของ HTML

ดูเหมือนว่าตามคำถามของคุณที่คุณจะเขียนในไฟล์ผสม HTML และ PHP สิ่งนี้:

<?php
  if ($something) {
    echo '<p>Hello World.</p>';
  }
?>

ด้วยเหตุผลที่อธิบายไว้ข้างต้นเราไม่ต้องการให้ส่ง HTML ไปที่ PHP เราทำเช่นนี้:

<?php if ($something) { ?>
  <p>Hello World.</p>
<?php } ?>

เราลบ HTML ออกจากแท็ก PHP ของเราซึ่งเป็นการปรับปรุง แต่เราสามารถไปต่อ

ขอให้สังเกตว่าวงเล็บปีกกา uninformative ปิดคืออะไร? เราไม่รู้ว่ามันกำลังปิดลูปหรือคำสั่ง if สิ่งนี้ดูเหมือนเล็กน้อยในตัวอย่างข้างต้น แต่มักจะมีหลายบรรทัด HTML ใน if / endif ภายใน loop / endloop

แนวปฏิบัติที่ดีที่สุดคือในไฟล์ที่ผสม PHP และ HTML คุณจะใช้ไวยากรณ์ทางเลือกซึ่งไม่ใช้วงเล็บปีกกาเปิดและปิด ( { }):

<?php if ($something): ?>
  <p>Hello world.</p>
<?php endif; ?>

นอกเหนือจากความหมายของไวยากรณ์ใหม่ ( :และendif;แทนที่จะเป็น{และ}) คุณควรสังเกตสองสิ่ง:

  1. อีกครั้ง HTML และข้อความในขณะที่ควบคุมโดย PHP อยู่นอก<?php ?>แท็กดังนั้นจึงไม่ตีความ ด้วยเหตุผลที่อธิบายไว้ข้างต้นนี่เป็นสิ่งที่ดี
  2. นี่เป็นข้อมูลที่มากไปกว่านี้คือ php ทั้งหมดรวมถึงวงเล็บปิดแบบสุ่ม ( <?php } ?>) การปิดสิ่งที่หายากที่เปิดอยู่ (เพราะผสมกับ HTML ที่ดูยุ่ง ๆ ) ลองจินตนาการถึงไฟล์ HTML ขนาดใหญ่ที่มีลูปและถ้ามีคำสั่ง การระบุสิ่งที่คุณจะปิดสามารถชี้แจงได้มาก

ไวยากรณ์ที่เป็นมิตรกับเท็มเพลตเดียวกันสามารถใช้เป็นลูปได้เช่นกัน:

<?php foreach ($things as $thing): ?>
  <li><?php echo $thing; ?></li>
<?php endforeach; ?>

แท็กสั้น ๆ

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

หากไม่มีแท็กสั้นคุณต้องเขียน<?php echo $something; ?>แต่ด้วยแท็กสั้น ๆ คุณสามารถเขียนได้<?=$something?>และจะมีผลลัพธ์เหมือนกันทุกประการ

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

<li><?php echo $thing; ?></li>

ไปยัง

<li><?=$thing?></li>

ซึ่งอ่านได้มากขึ้น

เราจะไปต่อได้หรือไม่ ใช่. การใช้ระบบ templating ต่างๆคุณสามารถทำสิ่งต่าง ๆ เช่น:

<li>{thing}</li>

ซึ่งอ่านได้อย่างน่าอัศจรรย์ อย่างไรก็ตามระบบ Templating นั้นเป็นวิธีที่อยู่นอกขอบเขตของคำถามเดิม (ซึ่งฉันทิ้งไว้นานแล้ว)


4
+1 สำหรับการเป็นคำแนะนำที่ดีสำหรับทุกคน ไวยากรณ์ควบคุมทางเลือกและแท็กสั้น ๆ มีความสำคัญอย่างมากสำหรับการเริ่มต้นกับแม่แบบและการแยกลอจิกจากงานนำเสนอ
Will Meldon

1
ควรใช้แท็กสั้นด้วยความระมัดระวัง หากคุณกำลังสร้างรหัสที่จะนำกลับมาใช้ใหม่คุณไม่สามารถรับประกันได้ว่าshort_open_tagคำสั่งจะเปิดอยู่เสมอ PHP 5.4 ทำให้<?=$thing?>สามารถใช้งานได้ตลอดเวลาแม้เมื่อshort_open_tagปิดการใช้งาน นอกจากนี้ยังshort_open_tagมีการตั้งค่าเริ่มต้นเป็นปิดเพื่อป้องกันความขัดแย้งกับ XML
Chris

3
+1 สำหรับการแสดงทางเลือกที่แตกต่างกันไปสู่คำตอบที่ดีที่สุด
Tola Odejayi

1
อาจจะเคยเป็นจริง แต่ฉันเพิ่งตรวจสอบ opcodes (เช่นสิ่งที่ดำเนินการโดยเครื่องยนต์จริง) ใน PHP7 และผสม PHP / HTML แน่นอนไม่ "ประหยัดไฟฟ้า" โดยหลีกเลี่ยงการส่งข้อความคงที่ <?php $foo='ABC'; echo '<div>', $foo, '</div>'และ<?php $foo='ABC'; ?><div><?=$foo?></div>ส่งผลให้ opcodes เดียวกันที่แน่นอนคือพวกเขาเหมือนกัน
Josh จาก Qaribou

ในหมายเหตุเกี่ยวกับระบบสร้างเทมเปิลวิธีการสร้างเทมเปิลที่ง่ายที่สุดที่จะทำให้ตัวอย่างของคุณเป็นเรื่องง่าย Heredoc ช่วยให้คุณพูด<li>{$thing}</li>เหมือนที่คุณแสดงพร้อมความได้เปรียบเหนือเครื่องหมายคำพูดคู่ที่คุณไม่จำเป็นต้องหลีกเลี่ยงการใส่เครื่องหมายคำพูดคู่ไว้ข้างใน นอกจากนี้คุณยังสามารถมอบหมาย heredoc หรือส่งผ่านไปยังฟังก์ชั่นดังนั้นมันจึงสะอาดกว่า php / html ถ้าคุณใช้มันในบล็อกเช่น array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Josh จาก Qaribou

4

คุณกำลังเรียนรู้ลืมเกี่ยวกับประสิทธิภาพในหน้า PHP ให้เลือกวิธีที่อ่านง่ายที่สุดแทน

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

หากคุณกระตือรือร้นกับเบื้องหลังฉันจะอธิบายเกี่ยวกับสิ่งที่เกิดขึ้นกับเนื้อหาคงที่ในหน้า PHP หนึ่งในสิ่งแรกคือ "แจง" หน้าทั้งหมดลงในรหัสที่ปฏิบัติการได้ (เหมือนที่คุณเห็นระหว่าง<?php ?>แท็ก) ส่วนหนึ่งของเรื่องนี้คือการเปิดข้อความใด ๆ echoคงเป็น

ดังนั้นนี่คือ:

<?php echo "Hello World"; ?>
<br />
<?php echo "Welcome"; ?>

เปลี่ยนเป็นสิ่งที่ชอบ:

echo "Hello World";
echo "<br />";
echo "Welcome";

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

โปรดจำไว้ว่า: อ่านง่าย!


1
ฉันไม่เห็นด้วย. มันไม่ได้เกี่ยวกับการแสดง แต่มันเกี่ยวกับการเรียนรู้ ไม่ใช่คำแนะนำที่ดีในการเรียนรู้การปฏิบัติที่ผิด
ไอแซค

มันไม่เป็นความจริงที่ "ข้อความคงที่" กลายเป็นechoถ้าคุณหมายถึงอย่างแท้จริง (ซึ่งภาษาของคุณหมายถึง) ผลลัพธ์เหมือนกัน แต่วิธีการต่างกันมาก สิ่งที่คุณเรียกว่า "ข้อความคงที่" ในความเป็นจริงหนีออกจาก PHP เป็น HTML เมื่อสิ่งนี้เกิดขึ้นเซิร์ฟเวอร์จะเริ่มส่งข้อความแบบดิบ มันไม่ได้แยกทาง PHP, echoในขณะที่มันจะมี ความหมายของประสิทธิภาพอาจมีขนาดเล็กในกรณีที่ไม่ได้วางแผน แต่ความแตกต่างทางกลไกนั้นสำคัญ
underscore_d

0

หนึ่งในคุณสมบัติที่ดีที่สุดของ PHP คือมันถูกออกแบบมาให้ฝังใน HTML มันมักจะใช้ในการสร้างแม่แบบ มันทำให้โค้ดของคุณง่ายต่อการอ่านและบำรุงรักษาเพราะมันจะแยกรหัส PHP ออกจาก HTML

แต่ถ้าคุณพิมพ์หน้าคงที่อย่าง "Hello World!" เท่านั้น มันเป็นความคิดที่ไม่ดี


0

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

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

ในตัวอย่างของคุณคุณสามารถสตริง HTML เข้าด้วยกันเป็นหนึ่งคำสั่ง PHP ดังนี้:

    <?php echo "Hello World<br>Welcome"; ?>

หวังว่าจะช่วยให้กระจ่างขึ้นเล็กน้อย


0

มีข้อ จำกัด ในการใช้ HTML ภายใน PHP

ส่วนใหญ่คุณจะใช้ HTML นอก คุณจะสร้างหน้าเว็บตามที่คุณต้องการหากคุณไม่ได้ใช้ PHP จากนั้นเพิ่ม PHP ลงในส่วนของเอกสารที่คุณต้องการ คุณสามารถมี PHP หลายชิ้นภายในเอกสาร

การทำงานกับ PHP Inside HTML มีตัวอย่าง:

https://www.thoughtco.com/php-with-html-2693952


-1

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

มันก็เหมือนกับ HTML, CSS และ Javascript มันง่ายกว่าและเป็นจริงมากขึ้นเพื่อแยกมันออกมา

อย่างไรก็ตามในทางเทคนิคแล้วมันไม่มีความแตกต่างอย่างสิ้นเชิงกับวิธีที่คุณส่งสัญญาณ เพื่อ PHP มันเป็นเพียงไบต์ในแถว


6
มันสร้างความแตกต่าง <?php echo 'hello'; ?>ถูกส่งผ่านไปยัง PHP helloไม่ได้ถูกส่งผ่านไปยัง PHP สิ่งใดก็ตามที่ถูกส่งผ่านไปยัง PHP จะถูกแปลงเป็น bytecode จากนั้นตีความ ต้องใช้เวลากำลังประมวลผลและไฟฟ้า
Ted
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.