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:
-
<?php # to jest komentarz jednolinijkowy ?> -
<?php // to jest komentarz jednolinijkowy ?> -
<?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
Jeśli się zastanowić, to oni mają rację.
A wszystko przez to, że można mieszać HTML z PHP
Adres bezpośredni: http://urzenia.net/334/its-not-a-bug/#comment-29152
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 :)
Adres bezpośredni: http://urzenia.net/334/its-not-a-bug/#comment-29156
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.
Adres bezpośredni: http://urzenia.net/334/its-not-a-bug/#comment-29238
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 /**/ ?
Adres bezpośredni: http://urzenia.net/334/its-not-a-bug/#comment-29256
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.
Adres bezpośredni: http://urzenia.net/334/its-not-a-bug/#comment-29285
Wydaje Ci się oczywiste, że pisząc w kodzie:
// jakiś komentarz, w którym wstawiamy zakończenie kodu php (?>) bo do czegoś mi to potrzebnePowinieneś 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.
Adres bezpośredni: http://urzenia.net/334/its-not-a-bug/#comment-29313
To używaj /* */ - i tyle. Ile razy się zdarza, że znak ?> musi programista wstawić w jednolinijkowym komentarzu?
Adres bezpośredni: http://urzenia.net/334/its-not-a-bug/#comment-29407