Bug #19708 [Com]: PHP_CodeSniffer doesn't detect <% and <? if short_open_tag and asp_tags are off

From: Date: Tue, 20 Nov 2012 00:23:13 +0000
Subject: Bug #19708 [Com]: PHP_CodeSniffer doesn't detect <% and <? if short_open_tag and asp_tags are off
References: 1  Groups: php.pear.bugs 
Request: Send a blank email to pear-bugs+get-9359@lists.php.net to get a copy of this message
Edit report at https://pear.php.net/bugs/bug.php?id=19708&edit=1 ID: 19708 Comment by: wiltave@gmail.com Reported By: wiltave at gmail dot com Summary: PHP_CodeSniffer doesn't detect <% and <? if short_open_tag and asp_tags are off Status: Feedback Type: Bug Package: PHP_CodeSniffer Operating System: Debian Linux (Testing) Package Version: 1.4.2 PHP Version: 5.4.4 Assigned To: squiz Roadmap Versions: New Comment: I understand. Maybe you can close this bug report. Thank you again. Previous Comments: ------------------------------------------------------------------------ [2012-11-18 23:22:01] squiz I guess the problem is really that when those settings are off, the file is not valid PHP. I don't tokenize PHP files character by character (like I do for CSS and JS) so I dont know what context those tags are in. This could easily be done by a sniff though. One that detects if you are using short open tags and then bans them. It could look for T_OPEN TAG for cases where the ini setting is ON and it could also look for T_INLINE_HTML and look inside that content for cases where the ini setting is OFF. Adding additional tokenizing to the core for this would slow down processing, so a sniff works out better because it is optional to include in a standard. ------------------------------------------------------------------------ [2012-11-16 18:00:30] willianveiga Greg Sherwood, I got your point, but I think PHP_CodeSniffer should detect both as T_OPEN_TAG even if these configuration are set off. I've noticed about behaviour but somebody could not do the same. Using just my sniff above, without your recomendation, somebody with short_open_tag and asp_tags Off would not have the same code violations as somebody with these directive On. It would create inconsistencies. Maybe we should report it to PHP developers. But anyway, I am not sure at all if it makes sense. What do you think Greg? Thank you very much and sorry about my english. ------------------------------------------------------------------------ [2012-11-15 20:37:27] squiz -Status: Open +Status: Feedback -Assigned To: +Assigned To: squiz This is expected behaviour because PHP will not tokenize those tags as open and close tags. It tokenizes them as T_INLINE_HTML. If you run PHPCS over a file that only contains short open tags with that ini setting disabled, you'll get this: FILE: /Users/gsherwood/Sites/Projects/PHP_CodeSniffer/temp.php -------------------------------------------------------------------------------- FOUND 0 ERROR(S) AND 1 WARNING(S) AFFECTING 1 LINE(S) -------------------------------------------------------------------------------- 1 | WARNING | No PHP code was found in this file and short open tags are not | | allowed by this install of PHP. This file may be using short | | open tags but PHP does not allow them. -------------------------------------------------------------------------------- If you want to write a sniff that detects short open tags, you're going to need to look for T_INLINE_HTML tokens and then see if you can find <? or <% tags in the content. They will look like this: Process token 0 on line 1 [lvl:0;]: T_INLINE_HTML => <? echo TRUE; ?>\n Process token 1 on line 2 [lvl:0;]: T_INLINE_HTML => <% echo FALSE; %>\n So should be fairly easy to find. If that doesn't make sense, please let me know and I'll try and help get your sniff working. ------------------------------------------------------------------------ [2012-11-15 13:12:11] willianveiga -Summary: PHP_CodeSniffer doesn&#039;t detect &lt;% %&gt; and &lt;? ?&gt; when short_open_tag and asp_tags +Summary: PHP_CodeSniffer doesn&#039;t detect &lt;% and &lt;? if short_open_tag and asp_tags are off ------------------------------------------------------------------------ [2012-11-15 13:10:41] willianveiga Description: ------------ If short_open_tag and asp_tags are Off in php.ini, using the following sniff, PHP_CodeSniffer will not complain about coding standards violations: <?php class CIStandard_Sniffs_Php_MustUseFullOpeningTagsSniff implements PHP_CodeSniffer_Sniff { public function register() { return [T_OPEN_TAG]; } public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); $token = $tokens[$stackPtr]; $content = trim($token['content']); if ($token['code'] === T_OPEN_TAG && $content != '<?php') { $error = 'Always use full PHP opening tags (<?php), in case a server does not have short_open_tag enabled. found %s'; $data = [$content]; $phpcsFile->addError($error, $stackPtr, 'Found', $data); } } } Test script: --------------- <?php echo TRUE; ?> <? echo TRUE; ?> <% echo FALSE; %> Expected result: ---------------- -------------------------------------------------------------------------------- FOUND 2 ERROR(S) AFFECTING 2 LINE(S) -------------------------------------------------------------------------------- 2 | ERROR | Always use full PHP opening tags (<?php), in case a server does | | not have short_open_tag enabled. found <? 3 | ERROR | Always use full PHP opening tags (<?php), in case a server does | | not have short_open_tag enabled. found <% -------------------------------------------------------------------------------- Time: 0 seconds, Memory: 1.50Mb Actual result: -------------- Time: 0 seconds, Memory: 1.50Mb ------------------------------------------------------------------------ -- Edit this bug report at https://pear.php.net/bugs/bug.php?id=19708&edit=1

« previous php.pear.bugs (#9359) next »