Bug #19708 [Com]: PHP_CodeSniffer doesn't detect <% and <? if short_open_tag and asp_tags are off
| From: | wiltave@gmail.com | 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't detect <% %> and <?
?> when
short_open_tag and asp_tags
+Summary: PHP_CodeSniffer doesn't detect <% and <? 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