Lợi thế của việc sử dụng heredoc trong PHP là gì? [đóng cửa]


196

Lợi thế của việc sử dụng heredoc trong PHP là gì và bạn có thể đưa ra một ví dụ không?


4
Không có lý do mạnh mẽ nào thay thế tốt hơn heredocs
Shakti Singh

18
Tôi đã chỉnh sửa nó để mang tính xây dựng hơn và tạo ra cộng đồng câu hỏi wiki vì nó khá chủ quan. Lưu ý, Cộng đồng vẫn có thể đóng cái này, tôi đã chọn để nó mở vì bạn đang nhận được câu trả lời chất lượng.
Tim Post

9
Tại sao chính xác câu hỏi này không được coi là xây dựng?
Ambo100

Câu trả lời:


218

Cú pháp heredoc sạch hơn nhiều đối với tôi và nó thực sự hữu ích cho các chuỗi nhiều dòng và tránh trích dẫn các vấn đề. Ngày trước tôi thường sử dụng chúng để xây dựng các truy vấn SQL:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

Đối với tôi điều này có xác suất giới thiệu lỗi cú pháp thấp hơn so với sử dụng dấu ngoặc kép:

$sql = "
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = \"widgets\"
";

Một điểm khác là tránh thoát dấu ngoặc kép trong chuỗi của bạn:

$x = "The point of the \"argument" was to illustrate the use of here documents";

Biểu tượng với ở trên là lỗi cú pháp (trích dẫn thoát bị thiếu) Tôi vừa giới thiệu trái ngược với cú pháp tài liệu ở đây:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

Đó là một chút về phong cách, nhưng tôi sử dụng các quy tắc sau đây cho các tài liệu đơn, đôi và ở đây để xác định chuỗi:

  • Dấu ngoặc đơn được sử dụng khi chuỗi là một hằng số như'no variables here'
  • Nhân đôi dấu ngoặc kép khi tôi có thể đặt chuỗi trên một dòng và yêu cầu nội suy biến đổi hoặc trích dẫn đơn được nhúng"Today is ${user}'s birthday"
  • Ở đây tài liệu cho các chuỗi nhiều dòng yêu cầu định dạng và nội suy biến.

40
Nitpick trên ví dụ SQL của bạn: Bạn không nên sử dụng dấu ngoặc kép trong đó ở vị trí đầu tiên. Điều đó chỉ hoạt động với MySQL và chỉ khi máy chủ đó không chạy trong --ansichế độ tuân thủ. Chuỗi SQL phải sử dụng dấu ngoặc đơn.
mario

17
@mario Đó là để minh họa cho vấn đề với việc sử dụng dấu ngoặc kép nói chung không phải về chi tiết cụ thể của sql
Wes

4
Không phải nói rằng việc đặt các biến vào một truy vấn trực tiếp là một cách cư xử tệ, xấu :-P
Ý thức chung của bạn

5
@Wes và @mario Đây là ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
chương trình

11
"Không phải nói rằng việc đặt các biến vào một truy vấn trực tiếp là một cách cư xử tệ, xấu". Điều này là không đúng sự thật cả. Đặt đầu vào không được xác thực vào các câu lệnh SQL là "cách cư xử tệ". Việc đặt các biến trong các câu lệnh SQL đôi khi là cần thiết.
vogomatix

67

Heredoc là một thay thế tuyệt vời cho chuỗi trích dẫn vì tăng khả năng đọc và bảo trì. Bạn không phải thoát dấu ngoặc kép và (tốt) IDE hoặc trình soạn thảo văn bản sẽ sử dụng tô sáng cú pháp thích hợp.

Một ví dụ rất phổ biến: lặp lại HTML từ bên trong PHP:

$html = <<<HTML
  <div class='something'>
    <ul class='mylist'>
      <li>$something</li>
      <li>$whatever</li>
      <li>$testing123</li>
    </ul>
  </div>
HTML;

// Sometime later
echo $html;

Nó rất dễ đọc và dễ bảo trì.

Giải pháp thay thế là lặp lại các chuỗi trích dẫn, cuối cùng có chứa các trích dẫn thoát và IDE sẽ không làm nổi bật cú pháp cho ngôn ngữ đó, dẫn đến khả năng đọc kém và khó bảo trì hơn.

Câu trả lời cập nhật cho ý thức chung của bạn

Tất nhiên, bạn sẽ không muốn thấy một truy vấn SQL được tô sáng dưới dạng HTML. Để sử dụng các ngôn ngữ khác, chỉ cần thay đổi ngôn ngữ theo cú pháp:

$sql = <<<SQL
       SELECT * FROM table
SQL;

1
Bạn có biết tính năng " thoát khỏi PHP " của PHP không?
Ý thức chung của bạn

5
Thoát khỏi PHP đôi khi cũng tốt, nhưng khi bạn đang lặp lại nhiều thứ, cú pháp làm nổi bật cú pháp của bạn, bạn phải gõ nhiều ký tự hơn bằng cách thoát đơn giản khỏi PHP và PHP có nhiều lệnh để thực thi thay vì một tiếng vang. Ngoài ra, bạn có thể đặt chuỗi Heredoc thành một biến và lặp lại sau. Thoát PHP cho HTML của bạn có nghĩa là nó được in ra và sau đó. Không thể lưu nó cho sau này.
Jake Wilson

2
1. bạn có thể sử dụng bộ đệm đầu ra để lưu đầu ra. 2. Bạn đã sử dụng echo trong ví dụ đầu tiên của bạn. 3. (tốt) Trình soạn thảo văn bản hoặc văn bản của IDE KHÔNG BAO GIỜ phá vỡ việc tô sáng HTML khi bạn đang sử dụng thoát khỏi PHP. 4. IDE nào làm nổi bật cú pháp cho HEREDOC và quy tắc ngôn ngữ nào được sử dụng? Có ổn không khi thấy một truy vấn SQL được tô sáng dưới dạng văn bản HTML?
Ý thức chung của bạn

1
Một Heredoc là một chuỗi PHP. Tất nhiên bạn không thể sử dụng các cấu trúc điều khiển trong một chuỗi. php.net/manual/en/lingu.types.opes.php
Jake Wilson

11
Tôi nghĩ bạn hiểu nhầm Heredoc là chỉ áp dụng cho các chuỗi HTML. Heredoc chỉ đơn giản là một cách khác để xác định một chuỗi, cho dù đó là HTML hay truy vấn SQL hay bất cứ điều gì bạn muốn. Chúng dễ viết và duy trì hơn, câu trả lời của Wes ở trên cho thấy điều đó khá rõ ràng (mà nếu bạn lưu ý có tô sáng cú pháp chính xác. Đừng phàn nàn với tôi về việc NetBeans thất bại). Tôi không chắc tại sao bạn lại có vẻ rất muốn bỏ phiếu trả lời cho câu hỏi wiki cộng đồng ... Dù bạn có tin hay không, các nhà phát triển PHP ban đầu có thể đã đưa Heredoc vào PHP vì nó thực sự có ích trong một số trường hợp .. .
Jake Wilson

8

Một số IDE làm nổi bật mã trong chuỗi heredoc - điều này làm cho việc sử dụng heredoc cho XML hoặc HTML hấp dẫn trực quan.

Cá nhân tôi thích nó cho các phần dài hơn của XML vì tôi không phải quan tâm đến việc trích dẫn các ký tự trích dẫn và chỉ có thể dán XML.


6

Trước hết, tất cả các lý do là chủ quan. Nó giống như một vấn đề của hương vị hơn là một lý do.

Cá nhân, tôi thấy heredoc khá vô dụng và thỉnh thoảng sử dụng nó, hầu hết khi tôi cần đưa một số HTML vào một biến và không muốn làm phiền với bộ đệm đầu ra, để tạo một thông điệp email HTML chẳng hạn.

Định dạng không phù hợp với quy tắc thụt lề chung, nhưng tôi không nghĩ đó là một vấn đề lớn.

       //some code at it's proper level
       $this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
       $this->title = "Feedback";
       //and so on

Đối với các ví dụ trong câu trả lời được chấp nhận, nó chỉ đơn thuần là gian lận.
Thực tế, các ví dụ chuỗi sẽ ngắn gọn hơn nếu người ta không lừa dối họ

$sql = "SELECT * FROM $tablename
        WHERE id in [$order_ids_list]
        AND product_name = 'widgets'";

$x = 'The point of the "argument" was to illustrate the use of here documents';

3

Tôi không biết nếu tôi nói heredoc là sự lười biếng. Người ta có thể nói rằng làm bất cứ điều gì là sự lười biếng, vì luôn có nhiều cách rườm rà hơn để làm bất cứ điều gì.

Ví dụ: trong một số trường hợp nhất định, bạn có thể muốn xuất văn bản, với các biến được nhúng mà không phải tìm nạp từ tệp và chạy thay thế mẫu. Heredoc cho phép bạn từ bỏ việc phải thoát dấu ngoặc kép, vì vậy văn bản bạn nhìn thấy là văn bản bạn xuất ra. Rõ ràng, có một số tiêu cực, ví dụ, bạn không thể thụt vào di sản của mình và điều đó có thể gây bực bội trong một số tình huống, đặc biệt là nếu bạn dính vào cú pháp hợp nhất, đó là tôi.

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.