2010-02-21 38 views
14

Tôi thích cú pháp HEREDOC, ví dụ: cho các trường hợp cạnh của HTML được tạo không đáng để đưa vào mẫu.HEREDOC can thiệp vào mã thụt đầu dòng

Điều duy nhất làm phiền tôi về điều đó, mặc dù, là nội dung và điểm đánh dấu đóng của chuỗi heredoc tuân thủ cột đầu tiên. Các vít này được bố trí mã lồng nhau:

class myclass 
{ 

    function __construct() 
     { 
     $a = some_code(); 
     $b = some_more_code(); 
     $x = <<<EOT 

line1 
line2 
line3 
line4 

EOT;  

     $c = even_more_code(); 
     $b = still_more_code(); 
     ... 
     ... 
     ... 

bạn hiểu ý tôi là gì.

Hiện tại, điều này có thể không giải quyết được bằng cách sử dụng HEREDOC bình thường. Có ai đã làm việc này không? Ước mơ của tôi là có cú pháp HEREDOC với thụt đầu dòng tự động. Nhưng tôi đoán điều này là không thể mà không cần viết một số tiền biên dịch cho các tập tin nguồn.

Tôi có đúng không?

Trả lời

11

Đó là một vấn đề tôi thường có quá: mã không cũng thụt vào khi tôi sử dụng heredoc, và tôi thực sự thích heredoc :-(

Một vấn đề "lớn" là khi bạn chọn một khối toàn bộ mã, nhấn "tab" (hoặc bất kỳ giá trị nào tương đương trong IDE) để thụt lề nhiều hơn vì bạn đã thêm điều kiện arround hoặc bất kỳ thứ gì ... Và nó phá vỡ các chuỗi heredoc: bạn phải bỏ thụt lề bằng tay :-(

Thật không may, tôi chưa bao giờ thấy bất kỳ công cụ nào giống như công cụ bạn đang mô tả ...


Một giải pháp, tôi giả sử, sẽ là đặt chuỗi heredoc trong một tệp khác, và bao gồm nó - bao gồm giống như có thể thụt vào bình thường; nhưng nó cũng sẽ có nghĩa là một tập tin để tải, mà sẽ làm cho mã ít rõ ràng hơn.

+0

Yup, bao gồm một tệp khác gây nhầm lẫn quá nhiều ... Tôi đang nghĩ đến việc xây dựng "trình biên dịch trước" như LESS cho CSS, nhưng dường như quá nhiều nỗ lực (và một bước bổ sung) để đạt được quá ít . Quá tệ! –

+6

Sử dụng một số loại "biên dịch trước" cũng có nghĩa là mã bạn viết và xem * (trong IDE/trình soạn thảo) * không phải là mã được thực thi - và đây sẽ là nguồn gây nhầm lẫn, một ngày hay cách khác ... –

+0

Tắt chủ đề: Tôi khuyên bạn nên sử dụng trình chỉnh sửa có khả năng phân tích cú pháp phong nha để tự động thụt lề mã. Các IDE tốt (như PhpStorm) không cho phép bạn thụt lề HEREDOC đóng các thẻ ngay cả khi viết các tab một cách rõ ràng. – TheOperator

6

FYI, điều này không giải quyết được vấn đề của bạn, nhưng ngôn ngữ lập trình Ruby hỗ trợ heredocs thụt lề.

Bạn có thể muốn gửi yêu cầu tính năng tới các nhà phát triển PHP và sử dụng tài liệu Ruby làm ví dụ để chứng minh rằng ngôn ngữ hiện có giải quyết được vấn đề này, vậy tại sao không phải PHP?

2

Bạn không thể nhận dạng heredocs hoặc nowdocs bằng PHP. Đây là cách giải quyết của tôi:

function foo() { 
    $a = 123; 
    $b = 456; 
    $sum = $a + $b; 
    $html = " 
     <div> 
     <h1>sum a, b</h1> 
     Number a is $a, number b is $b<br> 
     a+b equals <b>$sum<b> 
     </div> 
    "; 
    echo $html; 
} 

này cho biết thêm không gian để mã html tạo ra nhưng nếu bạn sử dụng mod_pagespeed hoặc tương tự mods apache, máy chủ của bạn sẽ loại bỏ tất cả các không gian unnecesary.

Bạn có thể sử dụng kỹ thuật tương tự cho các truy vấn đa hàng sql:

function bar($sql, $id) { 
    $q= " 
     SELECT 
     name 
     , address 
     , phone 
     FROM users 
     WHERE id = '$id' -- possible mysql inyection 
     LIMIT 1 
    "; 
    $sql->query($q); 
} 

Những lợi ích mã trong khả năng đọc. Nó không có tác động trong hiệu suất và bạn có thể nhận xét các truy vấn SQL compex (với # hoặc -)

+2

Nhược điểm của phương pháp này là dấu ngoặc kép phải được thoát. – Tag

1

Tôi vừa phát hiện ra một giải pháp khác cho bất kỳ ai vẫn tự hỏi cách thực hiện việc này. Thụt lề dòng đầu tiên của bạn bắt đầu HEREDOC. Dòng thứ hai của bạn, là dòng đầu tiên của HEREDOC, không có khoảng trắng, vì vậy hãy để nó như một dòng trống. Bắt đầu một dòng mới sau đó, thụt lề và viết mã của bạn. Sau đó hoàn thành HEREDOC, một lần nữa không có khoảng trắng. Trực quan bạn sẽ nhận được tất cả các mã của bạn thụt lề, ngoại trừ việc hoàn thành HEREDOC. Đánh dấu + TAB vẫn là một vấn đề, nhưng ít nhất mã có thể đọc được nhiều hơn trong vòng điều khiển, v.v.

  $html = <<< HTML     //indented line 
               //leave this line empty 
      <div>        //indented line 
       <div>$variable</div>   //indented line 
      </div>        //indented line 
HTML;           //no white space, not indented 
+1

Tôi đã khôi phục câu trả lời này để sửa đổi 1. Các chỉnh sửa được thực hiện bởi @bgs hoàn toàn phá hủy toàn bộ điểm mà Wes đang cố gắng thực hiện. –

0

Tôi đã viết một hàm cho phép bạn thụt lề theo ý muốn. Nó thực sự là một chức năng khá đơn giản. https://github.com/chiedolabs/moon-walk-php

Tôi thích nó vì mã của tôi vẫn sạch sẽ theo cách này.

+0

Tôi có thể yêu cầu bạn xem lại bài đăng meta sau không? [Làm thế nào để cung cấp các thư viện mã nguồn mở cá nhân?] (Https://meta.stackexchange.com/q/229085) –

+0

Đúng, chỉ cần đọc @MartijnPieters! – Chiedo

+1

The * Với moonwalk: * ví dụ trên trang GitHub của bạn không đúng định dạng. Thẻ đóng cho HEREDOC phải xuất hiện ở đầu dòng, không thể thụt lề. – TheOperator

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