Niedawno spotkałem się z pewną… ciekawostką, którą podsunął mi jeden ze współuczestników szkolenia w jakim brałem udział. W języku PHP można komentować kod na kilka sposobów:

  1. <?php
    # to jest komentarz jednolinijkowy
    ?>
  2. <?php
    // to jest komentarz jednolinijkowy
    ?>
  3. <?php
    /* to jest komentarz
    wielolinijkowy */
    ?>

Moja ciekawostka dotyczy wersji 1 i 2. Teraz pytanie, dość proste: co zostanie wyświetlone w wyniku parsowania pliku PHP o treści:

<?php
echo 'aaa?>';
echo 'bbb';
?>

Dość oczywistym jest wynik:

aaa?>bbb

No to teraz pytanie drugie: co będzie wynikiem parsowania poniższego skryptu?

<?php
#echo 'aaa?>';
echo 'bbb';
?>

Dla mnie, i dla conajmniej kilku innych osób które od dość długiego czasu zajmują się PHP, oczywistym jest wynik:

bbb

Ale dla developerów PHP logicznym jest inny rezultat:

'; echo 'bbb'; ?> 

Cytat z manuala:

The “one-line” comment styles only comment to the end of the line or the current block of PHP code, whichever comes first. This means that HTML code after // … ?> or # … ?> WILL be printed: ?> breaks out of PHP mode and returns to HTML mode, and // or # cannot influence that. If the asp_tags configuration directive is enabled, it behaves the same with // %> and # %>.

Źródło: manual PHP


Liczba komentarzy: 7

  1. 1 Był Piątek, 16 marzec 2007 roku gdy o godzinie 16:49 przyszedł lato_p i stwierdził:

    Jeśli się zastanowić, to oni mają rację.

    A wszystko przez to, że można mieszać HTML z PHP

  2. 2 Był Piątek, 16 marzec 2007 roku gdy o godzinie 18:54 przyszedł MySZ i stwierdził:

    Nie mają. To jest linijka zakomentowana, i jako taka powinna być traktowana. A jeśli już, to żeby chociaż byli konsekwentni: czemu nie działa tak samo z komentarzami wielolinijkowymi? IMO bzdura, ale generalnie napisałem o tym, ponieważ to raczej nie jest szerzej znana informacja - ja pomimo kilku lat pisania w PHP nie wiedziałem o tym :)

  3. 3 Był Poniedziałek, 19 marzec 2007 roku gdy o godzinie 14:50 przyszedł Marcin Miczek i stwierdził:

    Oczywiście, że mają. Przecież umieszczając znak komentarza przed “echo” wyłączasz na chwilę parser PHP, a potem masz znaki “?>” czyli wyskakujesz z PHP. Sądzę, że postulowane przez Ciebie zachowanie powodowałoby jeszcze większe problemy.

  4. 4 Był Wtorek, 20 marzec 2007 roku gdy o godzinie 17:27 przyszedł MySZ i stwierdził:

    Jak dla mnie, to linia jest zakomentowana czyli nie powinna podlegać prawo parsera. Napotkany znak # lub // poza stringiem? Do końca linijki parser nie działa. Koniec.

    A w tej chwili brak jest jednoznaczności: dlaczego działa to inaczej w komentarzach /**/ ?

  5. 5 Była Środa, 21 marzec 2007 roku gdy o godzinie 11:11 przyszedł Dekoderek i stwierdził:

    Nie jestem programistą PHP jakoś bardzo, ale takie zachowanie jak teraz wydaje mi się bardzo oczywiste. Jak piszę komentarze do HTML (w plikach parsowanych przez PHP) to tagi i atrybuty komentuję przez nawet w środku tagu - user nic nie dostaje, a developer ma komentarze.

  6. 6 Był Czwartek, 22 marzec 2007 roku gdy o godzinie 00:06 przyszedł MySZ i stwierdził:

    Wydaje Ci się oczywiste, że pisząc w kodzie:
    // jakiś komentarz, w którym wstawiamy zakończenie kodu php (?>) bo do czegoś mi to potrzebne
    Powinieneś wyłączyć w zakomentowanym kawałku, powtarzam, w zakomentowanym, nie podlegającym parsowaniu kawałku, parser PHP dla całego pliku aż do następnego wystąpienia <?php ? Bo jak dla mnie oczywistym to nie jest. Po to są kometarze w kodzie, żeby można było sobie wstawiać tam głupoty, a czasem jakieś ważne rzeczy. A przez takie podejście do tematu zostaje to znacznie utrudnione.

  7. 7 Był Piątek, 23 marzec 2007 roku gdy o godzinie 16:20 przyszedł Dekoderek i stwierdził:

    To używaj /* */ - i tyle. Ile razy się zdarza, że znak ?> musi programista wstawić w jednolinijkowym komentarzu?

A Ty? Co o tym myślisz?

Możesz używać w komentarzach następujących znaczników:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Sblam! Antyspam