W PHP dlaczego </script> nie wyświetla błędu analizy?

193

Uruchomiłem następujący kod PHP :

<?php 
    </script>
?>

Nie wystąpiły błędy analizowania, a wynikiem było?>” ( przykład ).

W podobnych przypadkach pojawia się błąd analizy:

<?php 
    </div>
?>

Błąd analizy: błąd składni, nieoczekiwany „<” w ...

Dlaczego nie <?php </script> ?>podaje tego samego błędu?

Irfan
źródło
Po prostu ciekawy. Co próbujesz osiągnąć lub na czym eksperymentujesz?
asprin
8
W rzeczywistości sprawa była inna zeszłej nocy przegapiłem tag zamykający php, a potem miałem tag </script> i spędziłem ponad 30 minut, aby dowiedzieć się, dlaczego nie ma żadnego błędu, ale mimo to wynik nie jest tak pożądany .
Irfan,
7
Nie chcę już żyć na tej planecie.
Kzqai
2
PHP robi to ludziom.
xiankai

Odpowiedzi:

273

Dzieje się tak, ponieważ istnieją różne sposoby uruchamiania bloku kodu PHP :

  • <? ... ?>(znany jako short_open_tag)

  • <?php ... ?> (standard naprawdę)

  • <script language="php"> ... </script> (Niepolecane)

  • <% ... %> (przestarzałe i usunięte znaczniki w stylu ASP po 5.3.0)

Najwyraźniej możesz otworzyć blok PHP w jedną stronę, a zamknąć w drugą. Nie wiedziałem tego.

Więc w twoim kodzie otworzyłeś blok używając, <?ale PHP rozpoznaje </script>jako bliżej. Stało się:

<?php       <----- START PHP
</script>   <----- END PHP
?>          <----- JUST GARBAGE IN THE HTML
Pekka
źródło
31
Pamiętaj, że używanie <script language="php">nie jest zalecane.
John Dvorak,
4
Szybka uwaga, ponieważ przypomniałem sobie o pewnej zmianie w short_open_tagdyrektywie. W PHP 5.4 <?=skrót <?php echonie wymaga już short_open_tag. Przejście między systemami, które <?=były dostępne i niedostępne, zawsze mnie frustrowało. php.net/manual/en/ini.core.php#ini.short-open-tag
Chris
1
@thatmiddleway Należy pamiętać, że oficjalny dokument zaleca <?php ... ?>również: php.net/manual/en/language.basic-syntax.phpmode.php
John Dvorak
37

W PHP możesz użyć scriptznacznika, aby otworzyć blok PHP.

Więc możesz użyć

<script language="php">
    echo 'hello world';
</script>

Więc w swoim przykładzie zostały zmieszane normalny otwarty tag <?phpz tagiem zamykającym </script>. Parser zakłada więc, że cały tekst po tagu skryptu zamykającego jest normalny HTML.

Czytaj więcej w Ucieczka z HTML .

amd
źródło