Jaka jest zaleta korzystania z heredoc w PHP? [Zamknięte]

196

Jaka jest zaleta korzystania z heredoc w PHP i czy możesz pokazać przykład?

danidacar
źródło
4
Nie ma żadnego powodu, dla którego alternatywne są lepsze niż heredoki
Shakti Singh
18
Zredagowałem to, aby było bardziej konstruktywne, i zadałem pytanie społeczności wiki, ponieważ jest to dość subiektywne. Uwaga: Społeczność może to nadal zamknąć, postanowiłem pozostawić to otwarte, ponieważ otrzymujesz wysokiej jakości odpowiedzi.
Tim Post
9
Dlaczego dokładnie to pytanie nie jest uważane za konstruktywne?
Ambo100,

Odpowiedzi:

218

Składnia heredoc jest dla mnie o wiele czystsza i bardzo przydatna w przypadku ciągów wieloliniowych i unikania problemów z cytowaniem. Wcześniej użyłem ich do budowy zapytań SQL:

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

Dla mnie ma to mniejsze prawdopodobieństwo wprowadzenia błędu składniowego niż użycie cudzysłowów:

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

Inną kwestią jest unikanie podwójnych cudzysłowów w łańcuchu:

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

PProblem z powyższym jest błędem składniowym (brakujący cytat), który właśnie wprowadziłem, w przeciwieństwie do składni dokumentu tutaj:

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

Jest to trochę stylowe, ale używam następujących reguł jako reguł dla pojedynczych, podwójnych i tutaj dokumentów do definiowania ciągów:

  • Pojedyncze ciągi znaków są używane, gdy ciąg znaków jest stały'no variables here'
  • Podwójne cudzysłowy, gdy mogę umieścić ciąg w jednym wierszu i wymagać zmiennej interpolacji lub osadzonego pojedynczego cudzysłowu"Today is ${user}'s birthday"
  • Tutaj dokumenty dla ciągów wieloliniowych wymagających formatowania i interpolacji zmiennych.
Wes
źródło
40
Nitpick w twoim przykładzie SQL: Nie powinieneś używać w nim podwójnych cudzysłowów. Działa to tylko z MySQL i tylko wtedy, gdy ten serwer nie działa w --ansitrybie zgodności. Ciągi SQL muszą używać pojedynczych cudzysłowów.
Mario
17
@mario To było dla zilustrowania problemu z używaniem podwójnych cudzysłowów w ogóle, nie na temat specyfiki sql
Wes
4
Nie wspominając, że umieszczanie zmiennych w zapytaniu bezpośrednio jest złym, złym manierem :-P
Twój wspólny zmysł
5
@Wes i @mario To jest ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
programaths
11
„Nie mówię, że bezpośrednie umieszczanie zmiennych w zapytaniu to złe, złe maniery”. To wcale nie jest prawda. Umieszczanie niezweryfikowanych danych wejściowych w instrukcjach SQL jest „złym manierem”. Czasami konieczne jest umieszczanie zmiennych w instrukcjach SQL.
vogomatix
67

Heredoc są doskonałą alternatywą dla cytowanych ciągów ze względu na zwiększoną czytelność i łatwość konserwacji. Nie musisz uciekać przed cudzysłowami, a (dobre) IDE lub edytory tekstu użyją odpowiedniego podświetlenia składni.

Bardzo powszechnym przykładem: echo z HTML z poziomu 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;

Jest łatwy do odczytania i łatwy w utrzymaniu.

Alternatywą jest powtarzanie cytowanych ciągów, które w końcu zawierają cytowane znaki, a IDE nie podkreślą składni tego języka, co prowadzi do słabej czytelności i większych trudności w utrzymaniu.

Zaktualizowana odpowiedź na Twój zdrowy rozsądek

Oczywiście nie chcesz, aby zapytanie SQL było podświetlone jako HTML. Aby użyć innych języków, wystarczy zmienić język w składni:

$sql = <<<SQL
       SELECT * FROM table
SQL;
Jake Wilson
źródło
1
Czy znasz funkcję „ ucieczki przed PHP ”?
Your Common Sense
5
Ucieczka z PHP jest czasem w porządku, ale kiedy echo wielu rzeczy, składnia podświetlania nie działa, musisz wpisać więcej znaków przez proste ucieczkę z PHP, a PHP ma więcej poleceń do wykonania zamiast jednego echa. Możesz także ustawić ciąg Heredoc na zmienną i wywołać go później. Ucieczka z PHP dla twojego HTML oznacza, że ​​drukuje się tam i teraz. Nie mogę zapisać tego na później.
Jake Wilson
2
1. możesz użyć buforowania danych wyjściowych, aby zapisać dane wyjściowe. 2. Używałeś echa w pierwszym przykładzie. 3. (dobre) IDE lub edytory tekstu NIGDY nie przerywają podświetlania HTML, gdy używasz ucieczki z PHP. 4. Jakie IDE wyróżnia składnia dla HEREDOC i jakie reguły językowe są używane? Czy można wyświetlać zapytanie SQL jako tekst HTML?
Twój zdrowy rozsądek
1
Heredoc to ciąg PHP. Oczywiście nie można używać struktur kontrolnych w ciągu. php.net/manual/en/language.types.string.php
Jake Wilson
11
Myślę, że źle zrozumiałeś, że Heredoc stosuje się tylko do ciągów HTML. Heredoc to po prostu alternatywny sposób definiowania łańcucha, czy to HTML, zapytanie SQL, czy cokolwiek chcesz. Łatwiej je pisać i utrzymywać, powyższa odpowiedź Wesa pokazuje to dość wyraźnie (co, jeśli zauważysz, że ma poprawne podświetlanie składni. Nie narzekaj na mnie, że NetBeans zawodzi). Nie jestem pewien, dlaczego tak bardzo zależy ci na głosowaniu w dół na pytanie społeczności wiki ... Wierzcie lub nie, oryginalni programiści PHP mogli dołączyć Heredoc do PHP, ponieważ w niektórych przypadkach może być to przydatne ... .
Jake Wilson
8

Niektóre środowiska IDE automatycznie podświetlają kod w ciągach heredoc - co sprawia, że ​​użycie heredoc dla XML lub HTML jest wizualnie atrakcyjne.

Osobiście lubię to dla dłuższych części, np. XML, ponieważ nie muszę się troszczyć o cytowanie znaków cudzysłowu i mogę po prostu wkleić XML.

cweiske
źródło
6

Przede wszystkim wszystkie przyczyny są subiektywne. To bardziej kwestia gustu niż powodu.

Osobiście uważam, że heredoc jest zupełnie bezużyteczny i używam go od czasu do czasu, przez większość czasu, gdy muszę wprowadzić trochę HTML do zmiennej i nie chcę zawracać sobie głowy buforowaniem danych wyjściowych, na przykład w celu utworzenia wiadomości e-mail w formacie HTML.

Formatowanie nie pasuje do ogólnych reguł wcięć, ale nie sądzę, żeby to była wielka sprawa.

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

Jeśli chodzi o przykłady w zaakceptowanej odpowiedzi, to tylko oszustwo.
Przykłady strun są w rzeczywistości bardziej zwięzłe, jeśli się ich nie zdradzi

$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';
Twój zdrowy rozsądek
źródło
3

Nie wiem, czy powiedziałbym, że heredoc to lenistwo. Można powiedzieć, że robienie czegokolwiek jest lenistwem, ponieważ zawsze istnieją bardziej nieporęczne sposoby.

Na przykład w niektórych sytuacjach możesz chcieć wyprowadzić tekst z osadzonymi zmiennymi bez konieczności pobierania z pliku i uruchamiania zamiany szablonu. Heredoc pozwala ci zrezygnować z cudzysłowów, więc tekst, który widzisz, to tekst, który wypisujesz. Oczywiście istnieją pewne negatywy, na przykład, nie możesz wciąć swojego heredoc, a to może stać się frustrujące w niektórych sytuacjach, szczególnie jeśli jesteś zwolennikiem jednolitej składni, którą jestem.

asnyder
źródło