note 83023 deleted from control-structures.switch by peehaa

From: 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 ;

« previous php.notes (#197691) next »