note 83023 deleted from control-structures.switch by peehaa
| From: | peehaa@php.net | Date: | Mon, 02 Dec 2013 09:07:39 +0000 |
| Subject: | note 83023 deleted from control-structures.switch by peehaa | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-197691@lists.php.net to get a copy of this message | ||
Note Submitter: johan at dotco dot net
----
A switch statement with more than one default is valid in PHP 5.2.6. However, only the last default
gets executed as the default clause.
<?php
switch(9) {
case 1:
echo 1 . "\n";
case 2:
echo 2 . "\n";
break;
case 3:
echo 3 . "\n";
case 4:
echo 4 . "\n";
case 5:
echo 5 . "\n";
default:
echo 6 . "\n";
default:
echo 7 . "\n";
default:
echo 8 . "\n";
}
// Outputs:
// 8
//
// Did you expect 6 and 7 to print too?
switch(3) {
case 1:
echo 1 . "\n";
case 2:
echo 2 . "\n";
break;
case 3:
echo 3 . "\n";
case 4:
echo 4 . "\n";
case 5:
echo 5 . "\n";
default:
echo 6 . "\n";
default:
echo 7 . "\n";
default:
echo 8 . "\n";
}
// Outputs:
// 3
// 4
// 5
// 6
// 7
// 8
?>
The problem (if it is one), is in the recursive definition of the default clause of a case_list in
the parser.
zend_language_parser.y
// Many default clauses allowed.
case_list:
/* empty */
| case_list T_CASE expr case_separator inner_statement_list
| case_list T_DEFAULT case_separator inner_statement_list
;
// Only one default clause allowed.
case_list:
/* empty */
| case_list T_CASE expr case_separator inner_statement_list
| T_DEFAULT case_separator inner_statement_list
;