Tại sao có <? Php và?> Trên mỗi dòng


24

Tôi đã thấy hội nghị này khá nhiều ở khắp mọi nơi, và đôi khi, nó đến gần để khiến tôi phát điên:

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

Trường hợp <?phpđóng và ?>ở trên mỗi dòng đơn, ngay cả khi không có mã HTML can thiệp.

Câu hỏi của tôi là: Tại sao? Tại sao bao gồm tất cả các thẻ phụ?

Đối với tôi, có vẻ như quy ước này thêm một lượng lộn xộn đáng kể vào mã, gây khó chịu khi theo dõi ngay từ đầu và thêm rằng nhiều nơi nữa vô tình bỏ qua một thẻ mở hoặc đóng.

CHÚ THÍCH

Đây là mã được lấy từ chủ đề Twenty-Tw 12, ví dụ được đưa ra bởi WordPress.


đồng thời, tốc ký trong khi báo cáo = o
Tom J Nowell

3
Gắn cờ để đóng - không có câu trả lời dứt khoát cho câu hỏi này và chắc chắn đó không phải là vấn đề cụ thể của WP - bất kỳ người nào làm việc với PHP sẽ phải đối mặt với vấn đề này
anu

3
@anu: Đầu tiên, một câu hỏi có thể không phải lúc nào cũng có một câu trả lời dứt khoát (mặc dù nó vẫn có thể có câu trả lời hay nhất). Các hướng dẫn nói "thực tế, và có thể trả lời". Thứ hai, vâng, về mặt kỹ thuật đây là một vấn đề về PHP, nhưng tôi đã thấy điều này rất nhiều, nhiều hơn nữa trong thời gian ngắn làm việc với WP. Vì vậy, trong khi điều này không giới hạn ở WP, thì dường như tôi có đủ tương quan để hỏi trong cài đặt WP.
Bản địa

Câu trả lời:


20

Điều này không được khuyến nghị trong bất kỳ hướng dẫn về phong cách WordPress nào và tôi nghĩ đó là một phong cách mã hóa tồi. Người mới bắt đầu sử dụng phong cách này, có thể vì cảm thấy giống HTML HTML hơn

Thật không may, các chủ đề mặc định đang sử dụng phong cách này quá thường xuyên, vì vậy một số người mới bắt đầu có thể nghĩ rằng đó là một phần của phong cách mã.

Một nhược điểm của phong cách này là xử lý bình luận. Nhìn kỹ vào ví dụ sau và cách nó không làm những gì tác giả có thể mong đợi:

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

Chúc may mắn gỡ lỗi đó. :)

Quy tắc: Chỉ chuyển đổi giữa ngữ cảnh PHP và HTML nếu bạn phải tạo đầu ra bằng cả hai ngôn ngữ. Sử dụng ngắt dòng thường xuyên trong tất cả các trường hợp khác.

Cập nhật, suy nghĩ thêm: Mỗi tệp HTML hợp lệ là một chương trình PHP hoàn chỉnh và hợp lệ. Có, ngay cả khi nó không chứa một dòng mã PHP thực tế.

Nếu bạn bắt đầu từ HTML và thêm từng đoạn nhỏ PHP từng bước, bạn có thể kết thúc với phong cách chúng ta đang thảo luận ở đây. Đó là nơi tái cấu trúc vào trò chơi: Một khi mọi thứ chạy như mong đợi, hãy viết lại mã cho đến khi nó dễ đọc nhất có thể, dễ bảo trì và mở rộng, mà không cần lặp lại các phần.

Tôi đoán một số người hạnh phúc khi không có bước cuối cùng này, và đó là lý do tại sao điều này sẽ không chết sớm.


Thật đáng tiếc khi cú pháp tô sáng ở trên không hiển thị những gì thực sự xảy ra với nhận xét đó ...
web biết

9
@webwar Tôi nghĩ rằng minh họa vấn đề thậm chí nhiều hơn. :)
fuxia

Đúng :) (cộng với một số ký tự để giữ cho cảnh sát bình luận SE vui vẻ)
web biết

2
@AndyAdams Đủ công bằng, tôi đã nói lại điều đó. Và bây giờ đi đi, bạn ác giới thiệu. :)
fuxia

3
Chủ đề sử dụng phong cách này bởi vì làm khác đi là quá xấu xí. Khi tái cấu trúc các chủ đề, tôi muốn viết lại mã sao cho dễ đọc nhất có thể và điều đó có nghĩa là không có echo / printf / var_dump xung quanh và đặt từng cấu trúc điều khiển bên trong các cặp của chúng <? ... ?>để dễ hiểu hơn. Mặc dù vậy, một điều tôi làm khác với ví dụ của OP là tôi sẽ đặt the_post();dòng riêng của mình.
Nói dối Ryan

12

Trong khi tôi tránh điều này cho các bình luận PHP, tôi là một người mở PHP / gần gũi hơn trong các tệp mẫu. Sự thay thế liên quan đến việc lặp lại HTML thông qua các chuỗi PHP, theo quan điểm của tôi thậm chí còn tệ hơn. Như một ví dụ nguyên thủy:

<!-- 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>

Là ví dụ 2 dài dòng hơn? Có lẽ? Nhưng theo tôi thì dễ đọc và chỉnh sửa hơn. Bạn có thể tưởng tượng nó xấu đến mức nào đối với HTML phức tạp.

Ngoài ra, giống như một ghi chú bên lề: sử dụng endforeachendifkhi viết HTML giữa logic PHP của bạn giúp tăng khả năng đọc một tấn so với }.


5
lợi thế rất lớn của }hơn endiftuy nhiên là (trong nhiều biên tập viên), bạn có thể dễ dàng nhìn thấy nơi khai mạc {là và do đó cho dù tất cả mọi thứ đã được đóng đúng cách. Hãy thử tìm hiểu điều đó endifvà cả đống điều kiện ...

2
foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );- hai dòng, HTML và PHP tách biệt độc đáo. : P
fuxia

4
@toscho: Bạn hoàn toàn bỏ lỡ điểm. Bạn vẫn đang trộn PHP và HTML, những người thích kiểu thứ hai sẽ làm điều đó bởi vì chúng tôi muốn tránh có HTML bên trong chuỗi PHP. Tôi sử dụng kiểu thứ hai khi sử dụng PHP làm ngôn ngữ tạo khuôn mẫu vì đó là cách duy nhất để lồng một hỗn hợp PHP và HTML một cách hợp lý, trong khi tôi sử dụng trước đây khi sử dụng PHP làm ngôn ngữ kịch bản vì thường không có lý do chính đáng để có HTML trong tập lệnh khi bạn tách logic ứng dụng khỏi mẫu. Kiểu thứ hai sẽ còn tốt hơn nếu có sẵn các thẻ ngắn: <? ... ?><?= ... ?>.
Lie Ryan

1
@Piet: nếu bạn gặp khó khăn trong việc niềng răng, có lẽ bạn chưa bao giờ nghe thấy vết lõm? Ngoài ra, bạn sẽ có thể định cấu hình để làm nổi bật việc mở endiftrong bất kỳ trình chỉnh sửa phong nha nào.
Lie Ryan


10

Đây là sự lựa chọn giữa việc xem trang như:

  • như một thực thể hoàn toàn do PHP tạo ra
  • dưới dạng mẫu tài liệu HTML, được cung cấp bởi các thẻ mẫu PHP

Những người khác nhau có xu hướng nghĩ về nó khác nhau. Lưu ý rằng các hàm hiếm khi sử dụng kiểu này, vì chúng cảm thấy giống như khối PHP thuần túy hơn. Mặt khác, nó không phải là hiếm trong các mẫu bởi vì chúng được trải rộng hơn trên các tệp và số lượng HTML thuần túy có thể dễ dàng hơn so với PHP trong chúng.

Nếu bạn nhìn vào các công cụ tạo khuôn mẫu (Mustache, Twig, v.v.) - chúng trông rất giống phong cách này ngoại trừ cú pháp của chúng có xu hướng loại bỏ tính dài dòng của PHP đơn giản.

Tái bút: Tôi muốn lưu ý rằng tôi đang nói về việc nhúng PHP một cách lành mạnh vào HTML, chứ không phải theo nghĩa đen là mở và kết thúc các thẻ trên mỗi dòng chỉ vì lợi ích của nó.


2

Câu hỏi của tôi là: Tại sao? Tại sao bao gồm tất cả các thẻ phụ?

Câu trả lời khá đơn giản: Khán giả. Khi mọi người (không phải lập trình viên) lấy một chủ đề, sau đó FTP lên cài đặt của họ, chạy thiết lập 5 phút và cứ thế cảm thấy như lập trình với họ. Sau đó, khi họ muốn thêm hoặc thay đổi một dòng bất cứ thứ gì trong chủ đề của họ, thì họ có thể đã tìm ra HTML là gì. PHP vẫn sẽ nằm ngoài tầm với của họ. Vì vậy, dự đoán của tôi là ý tưởng đằng sau việc này là cho phép thêm hoặc loại bỏ các yếu tố dễ dàng hơn mà không phá vỡ mọi thứ khi chúng mắc lỗi.

Lưu ý: Đây không phải là những gì tôi thích, thích hoặc muốn giới thiệu. Đó chỉ là những gì tôi nghĩ tại sao điều này xảy ra.


0

Tôi đã thấy rằng một số lập trình viên mới được đào tạo theo cách này. Tôi đang theo dõi một khóa học 40 giờ trên Lynda và người hướng dẫn đang bỏ các thẻ PHP trên mỗi dòng, ngoại trừ các định nghĩa hàm. Có lẽ là để vẽ rõ ràng các dòng giữa HTML và PHP, điều này có thể giúp những người mới hiểu nơi HTML kết thúc và PHP bắt đầu. Sau đó, nó có lẽ là một thói quen. Tôi đã bắt đầu thấy khó chịu bởi chính nó và quyết định xem có ai phàn nàn không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.