Cái nào tốt hơn: bao gồm HTML bên trong mã PHP hay bên ngoài nó?


28

Nhìn vào cái này

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

Và bây giờ hãy nhìn vào điều này:

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

Mà một trong những ví dụ trên được coi là tốt hơn (ít nhất là từ quan điểm hiệu suất)?.

Tôi biết các ví dụ là tầm thường nhưng tôi muốn theo thói quen thực hành tốt ngay từ đầu để khi tôi có càng nhiều dòng thì chúng sẽ không ảnh hưởng đến hiệu suất hoặc bất cứ điều gì theo cách tiêu cực.


14
Điều này dường như không phổ biến rộng rãi trong PHP, nhưng lưu ý rằng trong các hệ sinh thái khác, cả hai đều bị coi là xấu và cách thay thế phù hợp là tạo một mẫu của tất cả các phần tĩnh với logic tối thiểu để bao gồm các phần động, và sau đó kết xuất nó từ ngôn ngữ lập trình.

1
@delnan - Bạn nên xem xét việc đăng bài đó như một câu trả lời, dưới dạng hơi mở rộng. Đó là sạch sẽ hơn rất nhiều.
jmort253

@ jmort253 Đã xem xét nó, nhưng tôi có rất ít kiến ​​thức về PHP, vì vậy tôi không thể nói về các thực tiễn tốt nhất trong thế giới PHP.

Vấn đề gì bạn đang cố gắng giải quyết?
Jim G.

Về mặt hiệu suất, nó không thành vấn đề. Mạng chậm hơn rất nhiều so với. Chi phí chuyển nhượng cao hơn đáng kể do đó làm cho chi phí sản xuất không đáng kể so với.
Martin York

Câu trả lời:


23

Như bình luận chỉ ra, nó nên được thực hiện bởi các mẫu. Nhưng nếu chỉ có hai sự lựa chọn của bạn là có thể. Trường hợp 1 sẽ tốt hơn. Đây là khái niệm tương tự như bố cục thổi phồng Android của xml, hoặc lập trình tạo giao diện người dùng. Bạn <br/>là một nội dung tĩnh từ html của bạn và tất cả máy chủ của bạn sẽ làm là hiển thị nó. Nhưng nếu bạn sử dụng php, để thực thi nó, điều này sẽ sử dụng tài nguyên máy chủ của bạn và được tính toán.

Đây là cách nó nên được thực hiện: index.php:

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

header.html và footer.html là các mẫu.


1
Tôi đã đọc một cuốn sách cho Kevin Yank, đó là "PHP & MySQL Novice to Ninja" về một thứ gọi là Bộ điều khiển và mẫu. Đây có phải là những điều tương tự bạn đã nói với tôi hoặc chúng khác nhau? Nếu chúng giống nhau, làm thế nào để đặt mã trong các tệp khác nhau sẽ làm cho nó hoạt động tốt hơn?
Rashed

Mẫu làm cho trang web hoặc ứng dụng của bạn dễ dàng hơn. Bạn có thấy các tiêu đề và chân trang hoặc thậm chí các bài đăng của StackOverflow giống nhau không? Họ đang sử dụng cùng một khuôn mẫu và điền nó với dữ liệu động.
wtsang02

Lý do chính đằng sau đó là gì? Điều gì xảy ra nếu chúng ta không làm theo cách đó? chúng ta sẽ mất gì
Rashed

Hãy nhìn vào điều này. Đây là bình luận thứ 4 của bài trả lời này. Nếu bạn xem trang này trên nguồn ngay bây giờ, bạn sẽ thấy "<div> <span ...> ... </ span> <a ...> ... </a>" Hình ảnh bàn tay mã hóa nhận xét thứ 4000. Điều đó có thể không? hoặc chỉ tạo mẫu này dưới dạng mẫu và yêu cầu máy chủ của bạn 'thêm' cái này khi cần.
wtsang02

1
Ngoài ra @wtsang, bạn không bao giờ chỉ có hai lựa chọn đó, bạn luôn có lần thứ ba, chạy (hoặc học.)
ocodo

54

Để trả lời trực tiếp câu hỏi của bạn: Không bao giờ lặp lại văn bản tĩnh hoặc HTML. Để nó bên ngoài PHP của bạn.

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

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

Thoát khỏi PHP là một sự lãng phí nếu tất cả những gì bạn sẽ làm là chuyển qua văn bản tĩnh hoặc html tĩnh. Tất cả các mã bên trong <?php ?>được gửi đến PHP để được giải thích. Điều này có nghĩa là trang web của bạn chậm hơn và bạn đang lãng phí điện nếu bạn chuyển một lượng lớn văn bản tĩnh sang PHP mà không có lý do. (Đôi khi có một lý do.)

Thực hành tốt nhất là để logic và grunt của bạn hoạt động trong các tệp mà không cần bất kỳ HTML nào, chỉ có PHP.

Cách tôi muốn làm là với một khung MVC. Tôi có PHP thuần túy trong các mô hình và bộ điều khiển và hỗn hợp HTML và PHP trong các khung nhìn. Bạn không cần một khung MVC; bạn chỉ có thể dán hỗn hợp HTML của mình vào các tệp mẫu, sau đó bạn đưa vào các tệp PHP thuần túy của mình.

Khi bạn có các biến của mình (không bao gồm HTML trong chúng) được tạo trong các tệp PHP thuần túy, bạn có thể chuyển chúng sang tệp bằng HTML của mình. Ở đó, và chỉ ở đó, việc kết hợp HTML và PHP là tốt. Nhưng, và đây là một điều quan trọng nhưng, khi làm việc với các tệp có HTML, hãy giữ PHP ở mức tối thiểu.

May mắn thay, PHP đi kèm với các công cụ thân thiện để giúp PHP dễ đọc hơn khi trộn với html.

Cú pháp thay thế

Cách thực hành tốt nhất là sử dụng cú pháp PHP thông thường khi viết PHP thuần túy, nhưng cú pháp thay thế, khi trộn PHP và HTML.

Trong các tệp PHP thông thường mà không có bất kỳ HTML nào:

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

Điều này là đẹp cho PHP thuần túy, nhưng không lý tưởng khi thoát khỏi HTML. Đặc biệt, các dấu ngoặc nhọn thường khó hiểu khi chúng xuất hiện trong đống HTML lớn.

Dường như, dựa trên câu hỏi của bạn mà bạn đã viết, trong một tệp trộn HTML và PHP, điều này:

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

Vì các lý do được mô tả ở trên, chúng tôi muốn HTML không được gửi đến PHP. Chúng tôi làm như vậy:

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

Chúng tôi đã lấy HTML của mình ra khỏi các thẻ PHP, đây là một cải tiến. Nhưng chúng ta có thể đi xa hơn.

Chú ý làm thế nào không chính xác các nẹp đóng cửa là? Chúng tôi không biết nếu nó đang đóng một vòng lặp hoặc một câu lệnh if. Điều này có vẻ tầm thường trong ví dụ trên, nhưng thường có hàng tá dòng HTML bên trong if / endif bên trong một vòng lặp / endloop.

Cách thực hành tốt nhất là trong một tệp trộn PHP và HTML, bạn sử dụng cú pháp thay thế, bỏ qua dấu ngoặc mở và đóng ( { }):

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

Ngoài ngữ nghĩa của cú pháp mới ( :endif;thay vì {}), bạn nên chú ý hai điều:

  1. Một lần nữa, HTML và văn bản, trong khi được kiểm soát bởi PHP, nằm ngoài các <?php ?>thẻ, vì vậy nó không được diễn giải. Đối với các lý do được mô tả ở trên, điều này là tốt.
  2. Điều này có nhiều thông tin hơn so với việc đây là tất cả php bao gồm cả niềng răng đóng ngẫu nhiên ( <?php } ?>) đóng những thứ khó tìm thấy ở nơi chúng mở (vì chúng được trộn lẫn với một buch của HTML trông lộn xộn). Một lần nữa, hãy tưởng tượng một tệp HTML lớn với các vòng lặp và các câu lệnh if. Chỉ định những gì bạn đang đóng có thể làm rõ rất nhiều.

Cú pháp thân thiện mẫu tương tự cũng có thể được sử dụng cho các vòng lặp:

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

Thẻ ngắn

Một công cụ tuyệt vời khác do PHP cung cấp, một lần nữa, bạn chỉ muốn sử dụng khi trộn PHP và HTML với nhau, là các thẻ ngắn. Bạn có thể phải bật các thẻ ngắn trong tệp php.ini. Sau khi bật, các thẻ ngắn làm cho mọi thứ thậm chí còn dễ đọc hơn.

Không có thẻ ngắn, bạn phải viết <?php echo $something; ?>nhưng với thẻ ngắn bạn có thể viết <?=$something?>và nó sẽ có kết quả chính xác như nhau.

Khi kết hợp các thẻ ngắn và cú pháp PHP thay thế, bạn thực sự có thể viết một số tệp HTML thanh lịch, bao gồm các phần tử PHP. Lấy ví dụ về vòng lặp cuối cùng của chúng tôi (chỉ là phần bên trong vòng lặp), các thẻ ngắn cho phép chúng tôi giảm:

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

đến

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

dễ đọc hơn nhiều

Chúng ta có thể đi xa hơn không? Vâng. Sử dụng các hệ thống tạo khuôn mẫu khác nhau, bạn có thể làm những việc như:

<li>{thing}</li>

Đó là tuyệt vời có thể đọc được. Tuy nhiên, các hệ thống khuôn mẫu nằm ngoài phạm vi của câu hỏi ban đầu (dù sao tôi đã để lại một lúc trước).


4
+1 Vì là lời khuyên tốt cho mọi người. Cú pháp điều khiển thay thế và các thẻ ngắn là vô cùng quan trọng để bắt đầu với các mẫu và tách logic khỏi bản trình bày.
Will Meldon

1
Các thẻ ngắn nên được sử dụng một cách thận trọng. Nếu bạn đang xây dựng mã sẽ được sử dụng lại, bạn không thể đảm bảo rằng lệnh short_open_tagsẽ luôn được bật. PHP 5.4 luôn <?=$thing?>sẵn sàng, ngay cả khi short_open_tagbị tắt. Ngoài ra, short_open_tagđược mặc định tắt để tránh xung đột với XML.
Chris

3
+1 để hiển thị các lựa chọn thay thế khác nhau, tiến tới câu trả lời tốt nhất.
Tola Odejayi

1
Có thể nó đã từng đúng, nhưng tôi chỉ kiểm tra các opcodes (tức là những gì thực sự được chạy bởi động cơ) trong PHP7 và trộn PHP / HTML chắc chắn không "tiết kiệm điện" bằng cách tránh truyền văn bản tĩnh. <?php $foo='ABC'; echo '<div>', $foo, '</div>'<?php $foo='ABC'; ?><div><?=$foo?></div>dẫn đến các opcodes chính xác giống nhau, tức là chúng giống hệt nhau.
Josh từ Qaribou

Về lưu ý về các hệ thống tạo khuôn mẫu, cách tiếp cận tạo khuôn đơn giản nhất cho phép ví dụ của bạn là một di truyền đơn giản. Heredoc cho phép bạn nói <li>{$thing}</li>như bạn đã thể hiện, với lợi thế hơn dấu ngoặc kép mà bạn không phải thoát khỏi dấu ngoặc kép bên trong nó. Bạn cũng có thể gán heredoc hoặc chuyển nó cho các hàm, vì vậy, php / html sẽ sạch hơn nhiều nếu bạn đang sử dụng nó trong các khối, ví dụ. array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Josh từ Qaribou

4

Bạn đang học, hãy quên hiệu suất trong các trang PHP. Thay vào đó, hãy chọn cách dễ đọc nhất .

Nhìn vào hai ví dụ của bạn, ví dụ thứ hai chắc chắn là dễ đọc nhất, mặc dù tôi nghĩ đó là do khoảng cách bạn đã sử dụng. Bạn nói rằng bạn đang tìm cách phát triển những thói quen tốt ngay từ đầu, tôi nghĩ rằng thời gian của bạn có thể được chi tiêu tốt hơn bằng cách làm cho mã của bạn đọc tốt. Điều này có thể có nghĩa là viết lại một phần nhiều lần cho đến khi bạn hài lòng với nó.

Nếu bạn thực sự quan tâm đến hậu trường, tôi sẽ giải thích điều gì xảy ra với nội dung tĩnh trong trang PHP. Một trong những điều đầu tiên là "phân tích" toàn bộ trang thành mã thực thi (như bạn thấy giữa <?php ?>các thẻ). Một phần của việc này là biến bất kỳ văn bản tĩnh nào thành một echo.

Vậy đây:

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

được chuyển thành một cái gì đó như:

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

Có một chi phí rất nhỏ liên quan đến việc phân tích cú pháp, nhưng không có sự khác biệt trong việc thực thi mã kết quả. Nếu bạn đang sử dụng trình tăng tốc PHP, việc phân tích cú pháp chỉ được thực hiện một lần và sau đó được lưu vào bộ đệm, do đó bạn sẽ không thấy sự khác biệt về hiệu suất sau khi tải trang đầu tiên.

Ghi nhớ: dễ đọc!


1
Tôi không đồng ý. Nó không chỉ là về hiệu suất, mà còn thực sự là về học tập. Nó không phải là một lời khuyên tốt để học một thực hành sai.
Isaac

Không đúng là "văn bản tĩnh" được chuyển thành một echo, nếu bạn có nghĩa là theo nghĩa đen (mà ngôn ngữ của bạn ngụ ý). Kết quả là như nhau, nhưng các phương pháp rất khác nhau. Những gì bạn gọi là "văn bản tĩnh" trên thực tế là thoát từ PHP sang HTML. Khi điều này xảy ra, máy chủ bắt đầu gửi văn bản thô. Nó không phân tích cú pháp thông qua PHP, như nó sẽ làm với echo. Ý nghĩa về hiệu suất có thể là nhỏ trong mọi trường hợp không xảy ra, nhưng sự khác biệt cơ học là quan trọng.
gạch dưới

0

Một trong những tính năng tốt nhất của PHP là nó được thiết kế để được nhúng trong HTML. Nó thường được sử dụng trong việc tạo mẫu. Nó làm cho mã của bạn dễ đọc và bảo trì hơn, bởi vì nó tách mã PHP khỏi HTML.

Nhưng nếu bạn chỉ in một trang tĩnh như "Hello World!" Đó là một ý tưởng tồi.


0

Để trả lời câu hỏi của bạn một cách đơn giản: đưa ra mã ví dụ của bạn, sẽ có rất ít nếu có sự khác biệt về độ hoàn hảo. PHP được xử lý ở cấp máy chủ / máy chủ trong khi HTML được xử lý bởi tác nhân người dùng / người đang xem trang web của bạn trên trình duyệt của họ. Ai sẽ nhanh hơn? Khó xác định.

Tôi đồng ý với những người khác nói rằng mỗi người đều có điểm mạnh và điểm yếu và có thể làm việc thực sự tốt với nhau. PHP có thể lập trình và có thể thực hiện các phép tính và làm việc với các biến. Vì lý do đó, tất cả các trang của tôi cuối cùng là PHP và gọi các đoạn mã HTML - các mẫu như đã được đề cập và chèn các biến để HTML của tôi trở nên động.

Trong ví dụ của bạn, bạn có thể xâu chuỗi HTML lại với nhau thành một câu lệnh PHP như vậy:

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

Hy vọng rằng sẽ giúp làm rõ một chút.


0

có những hạn chế trong việc sử dụng HTML trong PHP.

Hầu hết thời gian bạn sẽ có HTML của bạn bên ngoài. Bạn sẽ tạo một trang giống như bạn sẽ không sử dụng PHP, sau đó thêm PHP vào các khu vực của tài liệu mà bạn cần. Bạn có thể có một số đoạn PHP trong một tài liệu.

Làm việc với PHP Inside HTML có một số ví dụ:

https: // www. Dùtco.com / php-with-html-693952


-1

Nó thường được coi là hình thức xấu để xuất mã HTML từ PHP. Có một số lý do cho việc này, nhưng lý do chính là nó dễ dàng hơn, đặc biệt là về lâu dài, để duy trì mã nếu mã HTML và PHP được tách ra.

Nó cũng giống như HTML, CSS và Javascript; nó chỉ là dễ dàng hơn nhiều và thực tế hơn để giữ nó tách biệt.

Về mặt kỹ thuật, tuy nhiên, nó hoàn toàn không có sự khác biệt về cách bạn xuất công cụ. Đối với PHP nó chỉ là byte liên tiếp.


6
Nó làm cho một sự khác biệt. <?php echo 'hello'; ?>được chuyển qua PHP. hellokhông được chuyển qua PHP. Bất cứ điều gì được chuyển đến PHP đều được chuyển đổi sang mã byte. Điều này cần có thời gian, sức mạnh xử lý và điện.
Ted
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.