ทำไมถึงมี <? php และ?> ทุกบรรทัด


24

ฉันเคยเห็นอนุสัญญานี้เกือบทุกที่และบางครั้งมันก็ใกล้เคียงกับการขับรถฉัน:

<?php //The loop ?>
<?php while ( have_posts() ) : the_post(); ?>
    <?php the_content(); ?>
<?php endwhile; // end of the loop. ?>

ตำแหน่งที่<?phpและปิด?>อยู่ในทุกบรรทัดแม้ว่าจะไม่มีโค้ด HTML แทรกแซงก็ตาม

คำถามของฉันคือ: ทำไม เหตุใดจึงต้องรวมแท็กพิเศษทั้งหมดเหล่านี้ด้วย

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

บันทึก

นี่คือรหัสที่ดึงมาจากชุดรูปแบบ Twenty-Twelve ตัวอย่างที่ได้รับจาก WordPress


เช่นเดียวกันจดชวเลขขณะที่ข้อความ = o
Tom J Nowell

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

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

คำตอบ:


20

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

น่าเสียดายที่ธีมเริ่มต้นใช้สไตล์นี้บ่อยเกินไปดังนั้นผู้เริ่มต้นบางคนอาจคิดว่าเป็นส่วนหนึ่งของสไตล์โค้ด

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

<?php echo 'Important: '; // announcement ?>
<?php echo ' enter the word '; /* start ?>
<?php echo '<b>password</b>'; /* the end */ ?>

ขอให้โชคดีในการแก้จุดบกพร่อง :)

กฎ: สลับระหว่างบริบท PHP และ HTML เฉพาะเมื่อคุณต้องสร้างผลลัพธ์ในทั้งสองภาษา ใช้ตัวแบ่งบรรทัดปกติในทุกกรณี

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

ถ้าคุณเริ่มต้นจาก HTML และเพิ่ม PHP ทีละเล็กทีละน้อย…คุณอาจท้ายด้วยสไตล์ที่เรากำลังพูดถึงที่นี่ นั่นคือสิ่งที่refactoringเข้ามาในเกม: เมื่อทุกอย่างทำงานอย่างที่คาดไว้ให้เขียนรหัสใหม่จนกว่าจะอ่านได้ง่ายที่สุดง่ายต่อการบำรุงรักษาและขยายโดยไม่ต้องทำซ้ำส่วนต่างๆ

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


เป็นเรื่องน่าเสียดายที่ไวยากรณ์ที่เน้นด้านบนไม่แสดงว่าเกิดอะไรขึ้นกับความคิดเห็นนั้นจริง ๆ ...
webaware

9
@webaware ฉันคิดว่ามันแสดงให้เห็นถึงปัญหามากยิ่งขึ้น :)
fuxia

จริง :) (บวกตัวอักษรบางตัวเพื่อให้ตำรวจ
คอมเม้นท์

2
@AndyAdams ยุติธรรมพอฉันได้ใช้คำนั้นใหม่ และตอนนี้ไปให้พ้นคุณผู้แนะนำที่ชั่วร้าย :)
fuxia

3
ชุดรูปแบบใช้สไตล์นี้เนื่องจากการทำอย่างอื่นนั้นน่าเกลียดเกินไป เมื่อปรับเปลี่ยนชุดรูปแบบฉันต้องการเขียนรหัสใหม่เพื่อให้สามารถอ่านได้มากที่สุดและนั่นหมายความว่าไม่มี echo / printf / var_dump รอบ ๆ และวางโครงสร้างการควบคุมแต่ละคู่ไว้ในคู่ของพวกเขาเอง<? ... ?>เพื่อให้เข้าใจได้ง่ายขึ้น สิ่งหนึ่งที่ฉันทำแตกต่างจากตัวอย่างของ OP คือฉันจะใส่the_post();ในบรรทัดของมันเอง
โกหก

12

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

<!-- Example 1 -->
<ul>
    <?php
        foreach ( $list_items as $list_item ) {
            echo "<li><a href='" . $list_item->url . "'>" . $list_item->name . "</a></li>";
        }
    ?>
</ul>

<!-- Example 2 -->
<ul>
    <?php foreach ( $list_items as $list_item ) : ?>
        <li>
            <a href="<?php echo $list_item->url; ?>">
                <?php echo $list_item->name; ?>
            </a>
        </li>
    <?php endforeach; ?>
</ul>

ตัวอย่างที่ 2 verbose เพิ่มเติมหรือไม่ บางที? แต่ง่ายต่อการอ่านและแก้ไขในความคิดของฉัน คุณสามารถจินตนาการได้ว่ามันน่าเกลียดแค่ไหนสำหรับ HTML ที่ซับซ้อน

นอกจากนี้เพียงแค่เป็นที่ทราบด้าน: การใช้endforeachและendifเมื่อเขียน HTML ระหว่าง PHP ตรรกะของคุณช่วยเพิ่มการอ่านตัน}เมื่อเทียบกับ


5
ข้อได้เปรียบอย่างมากของ}เรื่องendifนี้คือ (ในบรรณาธิการจำนวนมาก) คุณสามารถเห็นได้อย่างง่ายดายว่าช่องเปิด{นั้นอยู่ที่ใดดังนั้นจึงปิดไม่ได้อย่างถูกต้อง ลองหามันด้วยendifและเงื่อนไขทั้งหมด ...

2
foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );- สองบรรทัดคือ HTML และ PHP แยกกันอย่างชัดเจน : P
fuxia

4
@toscho: คุณพลาดจุดโดยสิ้นเชิง คุณยังคงผสม PHP และ HTML คนที่ชอบสไตล์ที่สองทำเพราะเราต้องการหลีกเลี่ยง HTML ภายในสตริง PHP ฉันใช้รูปแบบที่สองเมื่อใช้ PHP เป็นภาษาเทมเพลตเพราะเป็นวิธีเดียวที่จะผสมผสานส่วนผสมของ PHP และ HTML อย่างสมเหตุสมผลในขณะที่ฉันใช้รูปแบบเดิมเมื่อใช้ PHP เป็นภาษาสคริปต์เพราะโดยทั่วไปแล้วไม่มีเหตุผลที่ดีที่จะมี HTML ในสคริปต์เมื่อคุณแยกตรรกะแอปพลิเคชันจากแม่แบบ รูปแบบที่สองจะดียิ่งขึ้นถ้าแท็กสั้นมี: และ<? ... ?> <?= ... ?>
Lie Ryan

1
@Piet: หากคุณมีปัญหาในการจับคู่การจัดฟันคุณอาจไม่เคยได้ยินการเยื้องหรือไม่? นอกจากนี้คุณควรสามารถกำหนดค่าเพื่อเน้นการเปิดตัวของendifบรรณาธิการที่ดี
โกหก


10

นี่เป็นเรื่องเกี่ยวกับตัวเลือกระหว่างการดูหน้าเว็บเป็น:

  • เป็นเอนทิตีที่สร้างโดย PHP อย่างสมบูรณ์
  • เป็นเทมเพลตเอกสาร HTML ขับเคลื่อนโดยแท็กเทมเพลต PHP

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

ถ้าคุณดูเครื่องมือสร้างเทมเพลต (หนวด, ทวิก, ฯลฯ ) - พวกมันดูเหมือนสไตล์นี้มากยกเว้นว่าไวยากรณ์ของพวกมันมีแนวโน้มที่จะกำจัด PHP ที่ละเอียด

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


2

คำถามของฉันคือ: ทำไม เหตุใดจึงต้องรวมแท็กพิเศษเหล่านี้ทั้งหมด

คำตอบนั้นง่ายมาก: ผู้ชม เมื่อผู้คน (ไม่ใช่โปรแกรมเมอร์) คว้าชุดรูปแบบแล้วทำการติดตั้ง FTP ของพวกเขาขึ้นมาใช้งานการตั้งค่า 5 นาทีและอื่น ๆ รู้สึกเหมือนเขียนโปรแกรมอยู่แล้ว เมื่อพวกเขาต้องการเพิ่มหรือเปลี่ยนแปลงหนึ่งบรรทัดของสิ่งใดก็ตามในธีมของพวกเขาพวกเขาก็อาจจะรู้แล้วว่า HTML คืออะไร PHP ยังอยู่ไกลเกินเอื้อม ดังนั้นการเดาของฉันคือความคิดเบื้องหลังนี้คืออนุญาตให้เพิ่มหรือลบองค์ประกอบได้ง่ายขึ้นโดยไม่ทำลายทุกสิ่งเมื่อพวกเขาทำผิดพลาด

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


0

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

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