2011-09-28 12 views
5

Czy ktoś może zbadać zawiłości używania heredoc w PHP używając przykładowych fragmentów kodu PHP? , na podstawie tego, co mówi instrukcja poniżej?PHP Heredoc String Rules

php.net instrukcja mówi:

Bardzo ważne jest, aby pamiętać, że linia z identyfikatorem zamknięcia musi zawierać żadnych innych znaków, z wyjątkiem ewentualnie średnikiem (;). Oznacza to zwłaszcza, że ​​identyfikator nie może być wcięty i nie mogą istnieć spacje ani tabulatory przed lub po średniku. Ważne jest również, aby zdać sobie sprawę, że pierwszy znak przed identyfikatorem zamknięcia musi być znakiem nowej linii zdefiniowanym przez lokalny system operacyjny. Jest to \n w systemach UNIX, w tym w systemie Mac OS X. Po ograniczniku zamykającym (ewentualnie po średniku) musi również następować znak nowej linii.

Jeśli ta reguła zostanie zerwana, a identyfikator zamknięcia nie będzie "czysty", nie będzie on uważany za identyfikator zamknięcia, a PHP będzie go nadal poszukiwać. Jeśli odpowiedni identyfikator zamknięcia nie zostanie znaleziony przed końcem bieżącego pliku, w ostatnim wierszu zostanie wygenerowany błąd analizy.

Heredocs nie może być używany do inicjowania właściwości klas. Od PHP 5.3 ograniczenie to obowiązuje tylko dla zmiennych zawierających heredocs.

Oto link do instrukcji PHP: http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

+0

Co zawiłości masz na myśli? –

+0

Automatyczne wcięcie łańcucha heredoc, który jest częścią metody klasy. Niektóre IDE, takie jak Zend Studio, pozwalają ci wybrać kod i automatycznie go wciskać. To spowoduje wcięcie łańcucha heredoc. Czy to prawda? Próbowałeś tego? Jeszcze nie, ponieważ to będzie dla mnie czasochłonne. Jestem tylko początkującym php. Ale jest to jedno z pytań w moim umyśle. – stackoverflowpro

Odpowiedz

8

jest to proste zastosowanie:

$bar = "stackoverflowpro"; 
$foo = <<<HTML 
<p>Hello $bar</p> 
HTML; 
+0

Co jeśli jest częścią metody klasy? Będziesz musiał wprowadzić wcięcie dla czytelności kodu. dobrze? Jak zamierzasz sformatować kod klasy php, który zawiera powyższy kod? – stackoverflowpro

+0

Ten kod może być używany zarówno na prostej stronie php, jak i wewnątrz metody. Przykład użycia w metodzie może polegać na zwróceniu zmiennej $ foo, a następnie wydrukowaniu jej w dowolnym miejscu! – JellyBelly

+0

kod wewnątrz heredoc niestety nie może być sformatowany! – JellyBelly

6
echo <<< _html 

... some html code here ... 

_html; 

Ważne jest to, że znacznik zamykający jest dokładnie taki sam jak zdefiniowano po " < < < "i że etykieta zamykająca jest umieszczona bez wcięcia (bez zakładek, całkowicie lepka po lewej stronie) i jest zamknięta przez"; ".

Uwaga: "_" nie jest wymagane, ale używam go, aby wskazać lepiej, że jest to heredoc, który się zamyka.

+0

Co, jeśli jest częścią metody klasy? Będziesz musiał wprowadzić wcięcie dla czytelności kodu? dobrze? – stackoverflowpro

+0

Niestety, nie rozumiem, o co pytasz. – JNDPNT

+0

Chciałem powiedzieć, że: jeśli powyższy kod jest częścią klasy php i musisz sformatować kod, prawdopodobnie musisz wyciąć linię ogranicznika końcowego. Czy to złamie regułę? – stackoverflowpro

5

Zamknięty identyfikator dziedziczenia NIE MOŻE zawierać żadnych znaków między początkiem wiersza a identyfikatorem, może NATYCHMIAST mieć pojedynczy ; i NIE MOŻE mieć po nim żadnych innych znaków. Jeśli identyfikator zostanie wcięty, musi być traktowany jako część łańcucha heredoc. Jedyną postacią, która może pojawić się przed nową linią jest ;. Nie można nawet umieścić żadnych białych znaków między identyfikatorem a ; lub między ; a znakiem nowej linii. Oznacza to, że jeśli użyjesz heredoc wewnątrz wywołania funkcji, musisz wstawić podział wiersza zaraz po identyfikatorze zamknięcia (tj. Przed dowolnym , lub,, itp.).

Innymi słowy, jedyną rzeczą, która może pojawić się na linii z identyfikatorem zamknięcia, jest sam identyfikator i opcjonalnie jeden średnik (;) natychmiast po identyfikatorze. Następny chararcter (jeśli nie na End-Of-File) MUSI być poprawnym znakiem nowej linii dla systemu operacyjnego, na którym działa PHP.

Jest to prawidłowy ciąg heredoc:

$text = <<<EOT 
Hello! 
EOT; 

Ciąg heredoc nie został zamknięty i   EOT; jest uważana za część napisu:

$text = <<<EOT 
    Hello! 
    EOT; 

Poprzedni przykład stałej:

$text = <<<EOT 
    Hello! 
EOT; 

A heredoc wewnątrz wywołania funkcji (zauważ, że ); musi pojawić się na nowej linii do pracy):

print(<<<EOT 
Hello! 
EOT 
); 

Tak samo jak powyżej z bardzo dziwne wcięcia (zauważ, że jedyną rzeczą, na linii identyfikatora zamknięcie jest identyfikatorem i nowa linia). Hello! będzie miał pięć spacji przed nim w ciągu:

  print(<<<EOT 
    Hello! 
EOT 
        ); 
1

Oto próba przykład, który obejmuje wszystkie możliwe wykorzystanie zarówno heredoc i nowdoc:

<?Php 
if (isset($_GET['css'])) 
{ // SET THE CONTENT TYPE 
    header("Content-type: text/css"); 
    echo // ECHO THE CSS STRING USING HEREDOC 
    // AS YOU NOTICE HERE, WE INSERT THE GET DATA WITH "{}" TO MAKE IT EASIER TO DISTINGUISH THE VARIABLES 
<<<MYCSS 
button#{$_GET['css']} 
{  color:white; 
     background-color:black; 
     padding:10px; 
} 
MYCSS; 
    // IMMEDIATELY EXIT THE PHP SCRIPT TO SKIP THE REST OF THE CODE 
    exit(); 
} 
else if (isset($_GET['js'])) 
{ // SET THE CONTENT TYPE 
    header("Content-type: text/javascript"); 
    echo // ECHO THE JAVASCRIPT STRING USING HEREDOC 
    // AS YOU NOTICE HERE, WE INSERT THE GET DATA WITH "{}" TO MAKE IT EASIER TO DISTINGUISH THE VARIABLES 
<<<MYJS 
function doSomething(param) 
{ alert(param); 
} 
$(document).ready 
( function() 
    { $("button#{$_GET['js']}").click 
     ( function() 
      { doSomething('do me'); 
      } 
     ); 
    } 
); 
MYJS; 
    // IMMEDIATELY EXIT THE PHP SCRIPT TO SKIP THE REST OF THE CODE 
    exit(); 
} 

$myAjax = 'https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js'; 
$buttonID = md5(time().rand(111111,999999)); 
$myBottom = "\t".'\tlower body'; 
$doMe= "give head"; 
$head = <<<GIVEAHEAD 
<html> 
<head> 
    <title>An advanced use of heredoc and more</title> 
    <script type='text/javascript' src="$myAjax"></script> 
    <script type='text/javascript' src="{$_SERVER['PHP_SELF']}?js={$buttonID}"></script> 
    <link rel="stylesheet" href="{$_SERVER['PHP_SELF']}?css={$buttonID}" type='text/css'> 
</head> 
GIVEAHEAD; 

// HERE'S A VARIETY OF WAYS YOU CAN INSERT A HEREDOC INSIDE A FUNCTION 
echo iScream 
( $doMe, 
     $head 
,<<<SHOWMYBODY 

<body> 
SHOWMYBODY 
. 
<<<_TATSMAHBAREH 

    <button id='$buttonID'>touch me 
_TATSMAHBAREH 
// YOU CAN BASICALLY PUT YOUR '.' ANYWHERE BEFORE A HEREDOC, BUT NOT AFTER A HEREDOC 
.pushIt(). 
<<<"FINISHOFF" 

{$myBottom} 
\taye\n 
FINISHOFF 
// A NOW DOC IS THE EQUIVALENT OF SINGLE QUOTE STRINGS 
// IT DOES NOT RECOGNIZE VARIABLES OR \t AND \n 
,<<<'ThisIsANowDoc' 
    $ThisWillNotBeTreatedAsAVariable 
    \tnope 
</body> 
</html> 
ThisIsANowDoc 
// A HEREDOC OR A NOWDOC CAN BE FOLLOWED BY A SEMICOLON (;), BUT NOT WITH ANYTHING ELSE 
); 

// RETURNING A HEREDOC FROM A FUNCTION 
function pushIt() 
{ return <<<YOLO 
</button> 
YOLO; 
// ENDING A HEREDOC; YOU CANNOT PUT ANYTHING ELSE 
// AFTER THE SEMICOLON - NOT EVEN A WHITESPACE 
} 

function iScream($act,$insert,$here,$below) 
{ if($act == 'give head') 
    return "$insert$here$below"; 
} 
?>