php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #11447 Switch statement sensible for white-space
Submitted: 2001-06-12 18:51 UTC Modified: 2001-07-15 16:47 UTC
From: per dot persson at gnosjo dot pp dot se Assigned:
Status: Closed Package: Scripting Engine problem
PHP Version: 4.0.4pl1 OS: Linux (RedHat 6.2)
Private report: No CVE-ID: None
 [2001-06-12 18:51 UTC] per dot persson at gnosjo dot pp dot se
The following script gave a parse error:

<? switch($var): ?>
  <? case "alpha": ?>
    <p>Alpha</p>
  <? break; ?>

  <!-- ... -->

<? endswitch; ?>

Parse error: parse error, expecting `T_CASE' or `T_DEFAULT' or `'}'' in <my-path>/bug.php on line 2

First I thought that this was really a bug, but then, while typing this report I realized that non-PHP-mode characters (like the two spaces) probably are converted to an "echo" instruction, so the PHP-parser sees something like the following code:

  switch($var):
  echo '  ';
  case "alpha":
    echo '<p>Alpha</p>';
    break;
  endswitch;

The parser doesn't expect anything (but PHP-mode white-space) to come between the ':' on line 1 and 'case' on line 3 and therefore reports parse error. Right?

For the sake of "pretty-scripting", I would like this to change, but at the same time, now that I understand why the parser complains, I'm not sure if it should be changed...

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2001-06-12 19:13 UTC] per dot persson at gnosjo dot pp dot se
Section 7.4 in the FAQ is a little bit related.

Should perhaps the ending for a block of PHP-code be "?>" followed by any number of white-space characters?

 [2001-06-13 10:18 UTC] sniper@php.net
Use the {} instead of the : / endswitch; 
ie.

<?php 

  switch ($value) {
    case: ?>
    <p>Alpha</p>
    <?php 
    break; 
}

?>

And anyway, using <? ?> too much is really not good idea.
This is just stupid: <? some code ?><? more code?><? code..?>


 [2001-06-13 14:58 UTC] per dot persson at gnosjo dot pp dot se
Which style I use, the "classical" style (using {}) or the "alternative" style (using : and endswitch), doesn't matter; the problem is the same.

Sniper's comment about using <? ?> several times is surely justified when having one-line code as in his example, but when it comes to multi-line code, there is an issue of readability. I think that script A below is easier to read than script B. Don't you?

--- begin script A ---
<? switch($var): ?>

  <? case "alpha": ?>
    <p>Alpha</p>
  <? break; ?>

  <? case "beta": ?>
    <p>Beta</p>
  <? break; ?>

  <? default: ?>
    <p>Default</p>
  <? break; ?>
<? endswitch; ?>
---  end  script A ---

--- begin script B ---
<?
  switch($var):

  case "alpha": ?>
    <p>Alpha</p>
<? break;

  case "beta": ?>
    <p>Beta</p>
<? break;

  default: ?>
    <p>Default</p>
<? break;

  endswitch; ?>
---  end  script B ---

 [2001-06-19 12:29 UTC] vlad@php.net
The bug is valid - if you close and reopen the PHP tags between the switch and the case statement, it is going to bark at you. It shouldn't.

This does not work:
<? switch($var){ ?>
  <? case "alpha":
  break;
}?>

This does:
<? switch($var){
  case "alpha":
  break;
}?>

Why in the world would anyone do that, is a whole other issue, still they probably expect to be able to do just that. If they can't, we either need to document it as such, (thus re-classify this as documentation problem) or fix it. I do not know what it takes to fix that, but it is a valid report nevertheless.

Unbogusifying...

 [2001-06-19 17:16 UTC] per dot persson at gnosjo dot pp dot se
Observe that the spaces are significant.

This doesn't work:
<? switch($var){ ?>
  <? case "alpha":
  break;
}?>

This does!:
<? switch($var){ ?>
<? case "alpha":
  break;
}?>

I suppose that the interpreter converts text outside <? ?> to echo statements, so that the first code block is equivalent to:
<? switch($var){
  echo '  ';
  case "alpha":
  break;
}?>
This code block gave the same parse error as the first one!
(Expecting T_CASE or T_DEFAULT or '}')


 [2001-07-15 16:47 UTC] zeev@php.net
Spaces are indeed significant.  Here's why.

<? switch($var){ ?>
  <? case "alpha":
  break;
}?>

Is equivalent to
<? switch($var) {
print "  ";
  break;
}?>

The two spaces outside the PHP blocks are a valid two character HTML block!

Whereas:
<? switch($var){ ?>
<? case "alpha":
  break;
}?>

is equivalent to:

<? switch($var){
  case "alpha":
  break;
}?>

which is valid.


Vlad was wrong, the bug is not valid :)
 [2003-04-03 11:29 UTC] liamr at umich dot edu
Could you guys update the documentation to reflect this?
Just reading the sections on switches and the alternate syntax, I thought that this would work..

<?php switch ( $fruit ): ?>
    <?php case 'pears': ?>

I understand Zeev's response to Vlad, and having to do this instead...

<?php switch ( $fruit ): 
    php case 'pears': ?>

but there's no mention of this in the docs.
 [2004-07-21 16:19 UTC] devis at witcom dot com
this problem is still open on 4.3.4
 [2004-07-22 09:04 UTC] devis at witcom dot com
<? switch($var){ ?>
<? case "alpha":
  break;
}?>

should be equivalent to 

<? switch($var){ 
 print "\n"
 case "alpha":
  break;
}?>

so why does it work if this 

<? switch($var){ 
 print " "
 case "alpha":
  break;
}?>

does not work ?
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Mar 29 13:01:29 2024 UTC