2009-02-03 24 views
40

Xét về hiệu suất, điều gì sẽ tốt hơn. Sử dụng PHP để echo tất cả các đầu ra HTML để tôi có thể tiêu nó với các bit khác nhau của mã làm việc và biến hoặc thoát HTML sang php định kỳ trong suốt các tài liệu.Thoát HTML sang PHP hoặc Sử dụng Echo? Cái nào tốt hơn?

Tôi biết có thể có một số vấn đề về khả năng đọc nhưng tôi không lo lắng về điều đó.

Cảm ơn tất cả!

Ví dụ 1

echo '<html>', 
    '<body>', 
    'The content of the ',$container,' element is displayed in your ', $other_container, 
    '</body>', 
    '</html>'; 

HOẶC

<html> 
<body> 
The content of the <?php echo $container; ?> element is displayed in your <?php echo $other_container; ?> 
</body> 
</html> 
+1

Sửa mã cho bạn. Trong tương lai, thụt lề mã 4 không gian để có được stackoverflow để nhận ra nó như mã :) –

+0

ví dụ thứ hai là con đường để đi. bất cứ điều gì khác là một mùi mã. không có người nghiêm túc nào không đồng ý với số –

Trả lời

33

Đó là tất cả những gì bạn thấy dễ đọc nhất. Tất nhiên, điều này sẽ thay đổi theo từng tình huống. Nếu bạn đang làm toàn bộ một trang, và có những phần lớn không có bất kỳ PHP nào trong đó, thì tôi sẽ thoát ra khỏi PHP và chỉ viết HTML thuần túy, trong khi nếu có một phần có nhiều biến PHP , Tôi sẽ làm tất cả trong PHP.

Ví dụ:

<table> 
    <tr> 
     <td colspan="<?php echo $numCols; ?>"> 
      <?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?> 
     </td> 
    </tr> 
</table> 

so:

<?php 
echo "<table>" 
    . "<tr>" 
    . "<td colspan=\"" . $numCols . "\">" 
    .  $a . ", " . $b . " and " . $c 
    . "</td>" 
    . "</tr>" 
    . "</table>" 
; ?> 

Hoặc

<?php 
echo "<table> 
     <tr> 
      <td colspan='{$numCols}'> 
       {$a}, {$b}, and {$c} 
      </td> 
     </tr> 
     </table>"; 
?> 

Cũng đừng quên về printf

<?php 
printf("<table>" 
    . "<tr>" 
    . "<td colspan=\"%d\">%s, %s and %s</td>" 
    . "</tr>" 
    . "</table>" 
    , $numCols 
    , $a 
    , $b 
    , $c 
); 
?> 
+1

tôi đã đọc số đầu tiên, và không hoàn toàn đồng ý. Tôi đồng ý nhiều hơn với đề xuất của bạn! Stick với bất cứ điều gì là chiếm ưu thế. – benlumley

+4

Bạn bỏ lỡ heredoc;) – MarcinWolny

5

Nó rơi vào lĩnh vực tối ưu hóa vi. Phần lớn thời gian của bạn rơi vào khởi tạo công cụ PHP bắt đầu công việc.

Vì vậy, trừ khi bạn có hàng chục nghìn dòng (hoặc thậm chí nhiều hơn), bạn không nên quan tâm đến nó.

Để thêm, tôi đã làm một thử nghiệm nhỏ của một triệu dòng, nơi tôi sử dụng php để in chúng và nơi tôi sử dụng php để gọi một chương trình c đã làm điều tương tự và sự khác biệt đã được trừ đi.

Một chút thông tin khác.

Điều gì đang xảy ra trong ví dụ thứ 2 là bạn đang "bật/tắt" PHP, nó không chính xác những gì đang xảy ra nhưng cho ví dụ này nó phù hợp.

Điều bạn nên lo lắng hơn, đó là mã sẽ có rất nhiều logic xung quanh nó? Tôi sẽ chia chuỗi đó thành nhiều chuỗi hơn hay thậm chí đặt nó ở những nơi khác nhau? Đây có phải là Chế độ xem của ứng dụng MVC không?

Đối với 1 và 2, nó có thể là một sự lộn xộn giữa một trong hai phương pháp. Nhưng đối với 3 tôi sẽ đi với phương pháp 2 vì những lý do này.

Chế độ xem trong ứng dụng web MVC chủ yếu là html/css. Vì vậy, tôi muốn thấy rằng được định dạng đúng và tôi muốn xem trong trình soạn thảo của tôi màu html. Vì vậy, đó là một lợi thế.

+0

Tôi hiểu ý của bạn, nhưng tôi vẫn muốn biết sự khác biệt. Cảm ơn. –

8

Nó không liên quan đến tốc độ tổng thể của ứng dụng mà bạn sử dụng.

Điều đó đang được nói, tôi biết bạn đã nói rằng bạn không quan tâm, nhưng hãy sử dụng câu lệnh thứ hai vì nó dễ đọc hơn một triệu lần. Và khả năng đọc là lớn.

30

Tùy chọn nào dễ đọc nhất.

Sự khác biệt về hiệu suất là khá không đáng kể so với hầu như bất kỳ vấn đề nào khác mà bạn gặp phải. Chắc chắn dễ đọc là bàn tay xuống vấn đề đầu tiên ở đây.

2

Đối với các bit nhỏ, tôi chỉ giữ tất cả trong chuỗi PHP, như khi lặp qua một mảng để tạo danh sách. Nhưng đối với các đống đánh dấu lớn hơn, tôi giữ nó ra khỏi PHP và chỉ cần thả vào PHP khi cần thiết.

Điều này phần lớn là vì tôi muốn tối ưu hóa để bảo trì. Không chỉ vì nó nhanh hơn để xem những gì đang xảy ra khi html có áp dụng cú pháp thích hợp, nhưng vì nó cũng làm cho những sai lầm do đọc sai sót của mã ít có khả năng xảy ra hơn.

Thực sự không phải là cách tốt nhất. Tôi chỉ cố gắng để phù hợp với những gì được mô tả ở trên, và giữ cho đôi mắt của tôi mở cho các tình huống mà có lẽ cách khác sẽ là một cách tốt hơn để xử lý nó.

22

Hãy trích dẫn the manual:

Ví dụ đưa ra ở đây là giả tạo, tất nhiên, nhưng cho outputting lớn khối của văn bản, bỏ học của PHP chế độ phân tích là tổng quát hơn hiệu quả hơn so với việc gửi bài của văn bản qua echo() hoặc print().


Nhưng hãy lắng nghe những người khác và tránh loại này vi tối ưu hóa và chọn một trong đó là dễ đọc hơn.

Tôi có thể đề xuất giải pháp thứ ba không? Bạn đã nghe nói về động cơ mẫu chưa? Chúng giúp bạn tạo sự tách biệt rõ ràng giữa mã và bản trình bày thường dẫn đến mã sạch hơn, dễ bảo trì hơn. Một công cụ mẫu phổ biến như vậy là ví dụ: smarty, nhưng có hàng trăm điểm mạnh khác nhau.

+0

Tôi ngạc nhiên bất cứ ai sẽ tìm thấy tiếng vang ra dễ dàng hơn để đọc như các IDE tôi đã gặp phải bỏ qua định dạng html trong html lặp lại. – Ishmael

+0

Plus 1 để trích dẫn hướng dẫn về hiệu suất. – lowtechsun

1

Loại thứ hai dễ đọc hơn nhiều. Nó cũng dễ dàng chỉnh sửa hơn (ví dụ bạn không phải thoát khỏi các trích dẫn trong HTML). Và nó bảo tồn khoảng trắng mà không gặp bất kỳ rắc rối nào, có thể được ưu tiên, đặc biệt là cho các mục đích gỡ lỗi.

Tôi gần như muốn PHP sẽ bật print()echo() để tự động chuyển đổi các ký tự HTML để mọi người sẽ ngừng sử dụng chúng để tạo HTML.

3

Xét về hiệu suất ... điều đó không quan trọng. Khả năng đọc mã là vua, một phần nhỏ của một phần trăm hiệu suất khác biệt sẽ không thay đổi bất cứ điều gì.

Phiên bản HTML thô thường dễ đọc nhất (và có thể có hiệu suất tốt nhất cho những gì nó đáng giá - nhưng giá trị của nó là gì: không có gì). Điều này không có gì ngạc nhiên: PHP là một ngôn ngữ lập trình HTML, toàn bộ điểm là xen kẽ HTML ở cấp độ cú pháp ngôn ngữ.

Nhìn vào mã của nickf để xem cách giữ cho nó có thể đọc được. Thụt lề là quan trọng! Đặt một mức độ thụt vào bên trong mỗi cấu trúc điều khiển PHP, vì vậy bạn có thể theo dõi chúng. ví dụ.:

<?php if ($error) { ?> 
    <p> Oh no, error! </p> 
<?php } ?> 

Cuối cùng, khi xuất ra nội dung, chẳng hạn như $ chứa trong ví dụ của bạn, bạn phải luôn luôn htmlspecialchars() nó, hoặc bạn sẽ có một ứng dụng đầy đủ các lỗ hổng bảo mật HTML tiêm, như mọi người mới PHP khác (và thậm chí nhiều nhà phát triển chuyên nghiệp, thật đáng buồn). Điều này quan trọng cho dù bạn sử dụng phương pháp nào để xuất nội dung.

Vì htmlspecialchars là khá một tên hàm annoyingly dài, bạn có thể thử xác định chức năng phím tắt của riêng bạn:

<?php 
    function h($s) { 
     echo(htmlspecialchars($s, ENT_QUOTES)); 
    } 
?> 

<ul> 
    <?php foreach ($things as $thing) { ?> 
     <li> <?php h($thing['name']) ?> </li> 
    <?php } ?> 
</ul> 
8

Tôi không biết về việc thực hiện điều này, nhưng trong PHP bạn cũng có thể sử dụng những gì tôi tin được gọi là một "Heredoc", mà tôi nghĩ rằng sẽ giúp với khả năng đọc trong loại đầu ra này.

nickf của ví dụ:

<table> 
    <tr> 
     <td colspan="<?php echo $numCols; ?>"> 
      <?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?> 
     </td> 
    </tr> 
</table> 

trở thành:

<?php 
echo <<<EOT 
<table> 
    <tr> 
     <td colspan="$numCols"> 
      $a , $b, and $c 
     </td> 
    </tr> 
</table> 

EOT; 

?> 

Tôi tin rằng cuối cùng khả năng đọc là một điều chủ quan, vì vậy mileage của bạn có thể thay đổi!

Ruth

+1

Tôi nghĩ rằng heredoc là hoàn hảo, nhưng có thể có một báo trước để xem ra cho tùy thuộc vào trường hợp sử dụng. Nếu có bất kỳ khoảng trắng nào trước 'EOT 'cuối cùng thì mọi thứ sẽ bị hỏng. Có một số lý do khiến điều này có thể vô tình xảy ra. Chỉ cần nhận thức được nó. – user1167442

1

Bạn nên nghiêm túc xem xét không bao giờ đặt PHP bên trong HTML. Bạn đang trộn logic với quan điểm làm cho một dự án lộn xộn.

Như những người khác đã nói, nếu bạn đầu ra vào html, sử dụng <?php echo $whatever; ?>

Nếu bạn phải ra một tấn thông tin nhìn vào sản lượng đệm.

3

Mã như thể lập trình viên tiếp theo tham gia dự án là kẻ giết người hàng loạt. Nói cách khác, sử dụng tùy chọn thứ hai mà bạn đã đề cập.

+1

Một quy tắc tốt để làm theo. – edude05

3

Điều này cần được xem xét nhiều hơn về vấn đề về khả năng đọc và bảo trì so với vấn đề về hiệu suất.

Như vậy, phương án 2 có một vài lợi thế cụ thể:

  1. Mã màu. Với tùy chọn 1, mọi thứ được tô màu như một câu lệnh echo làm cho việc đọc HTML trở nên khó khăn hơn.
  2. Intellisense - Với nhiều IDE, HTML trong câu lệnh echo PHP sẽ không tham gia vào intellisense, vì vậy bạn sẽ nhập tất cả HTML đó bằng tay.
2

Tôi thích sử dụng php heredoc chức năng, cách này tôi không cần phải thoát khỏi bất kỳ ký tự, ví dụ:

<?php 

$title = "heredoc is cool!!!"; 
$mySite = "http://www.php.net"; 

echo <<<LOL 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> 
<head> 

    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 

    <title> $title </title> 

<link rel="shortcut icon" href="$mySite/favicon.ico"> 
<link rel="search" type="application/opensearchdescription+xml" href="$mySite/phpnetimprovedsearch.src" title="Add PHP.net search"> 
<link rel="alternate" type="application/atom+xml" href="$mySite/releases/feed.php" title="PHP Release feed"> 
<link rel="alternate" type="application/atom+xml" href="$mySite/feed.atom" title="PHP: Hypertext Preprocessor"> 

<link rel="canonical" href="$mySite/manual/en/language.types.string.php"> 
<link rel="shorturl" href="$mySite/types.string"> 

<link rel="contents" href="$mySite/manual/en/index.php"> 
<link rel="index" href="$mySite/manual/en/language.types.php"> 
<link rel="prev" href="$mySite/manual/en/language.types.float.php"> 
<link rel="next" href="$mySite/manual/en/language.types.array.php"> 
LOL; 
?> 

Lưu ý:

Heredoc văn bản hoạt động giống như một đôi chuỗi được trích dẫn, không có dấu ngoặc kép . Điều này có nghĩa là dấu ngoặc kép trong một heredoc không cần phải là được thoát, nhưng vẫn có thể sử dụng các mã thoát được liệt kê ở trên. Các biến được mở rộng, nhưng cần phải cẩn thận khi biểu diễn các biến phức tạp bên trong một heredoc như với các chuỗi.

Các vấn đề liên quan