Req #77776 [Dup]: if inline goto
| From: | requinix@php.net | Date: | Thu, 21 Mar 2019 22:38:12 +0000 |
| Subject: | Req #77776 [Dup]: if inline goto | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-220117@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=77776&edit=1
ID: 77776
Updated by: requinix@php.net
Reported by: xxalfa at gmail dot com
Summary: if inline goto
Status: Duplicate
Type: Feature/Change Request
Package: *General Issues
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
If you want to continue the RFC process on your other request, read the How To you were linked that
tells you exactly what you need to do.
If you need an explanation of the difference between a statement and an expression, try
StackOverflow.
Previous Comments:
------------------------------------------------------------------------
[2019-03-21 22:35:10] requinix@php.net
Duplicate of request #72589.
------------------------------------------------------------------------
[2019-03-21 06:07:26] xxalfa at gmail dot com
That's right, with "foreach" and "return" it makes no sense.
"require_once" returns a 0 or 1. Why does not "goto" do the same? Can I jump =
1, I can not jump = 0.
------------------------------------------------------------------------
[2019-03-21 03:18:46] requinix@php.net
For the same reason you can't do it with a foreach or return: they are statements, not
expressions.
------------------------------------------------------------------------
[2019-03-21 03:11:21] xxalfa at gmail dot com
Description:
------------
I don't understand why "goto" is not treated like "require_once"?
Test script:
---------------
<?php
//-------------------------------------------------
// HEAD
//-------------------------------------------------
declare( strict_types = 1 );
header( 'Content-Type:text/plain' );
error_reporting( E_ALL );
ini_set( 'display_errors', '1' );
ini_set( 'html_errors', '0' );
define( 'CORE_DIR', dirname( __FILE__ ) . DIRECTORY_SEPARATOR );
isset( $argv ) or trigger_error( 'This is a command terminal application.',
E_USER_ERROR );
echo __FILE__ . ' [PID:' . getmypid() . '][PHP:' . phpversion() .
']' . PHP_EOL . PHP_EOL;
function process_recording( $process_message ) { echo 'event ' . $process_message .
PHP_EOL; }
//-------------------------------------------------
// WORKS AS DESIRED
//-------------------------------------------------
$test = 'foo';
$file_path = CORE_DIR . 'test.php'; // file content: <?php $test = 'bar';
file_exists( $file_path ) and process_recording( 'require_once ' . $file_path ) . (
require_once $file_path ) or process_recording( 'file_not_found ' . $file_path );
echo $test . PHP_EOL;
//-------------------------------------------------
// DOES NOT WORK AS DESIRED
//-------------------------------------------------
$action = 2;
// Parse error: syntax error, unexpected 'goto' (T_GOTO)
// $action === 1 and process_recording( 'goto_action_1' ) . goto goto_action_1;
// $action === 2 and process_recording( 'goto_action_2' ) . goto goto_action_2;
// $action === 1 and process_recording( 'goto_action_1' ) . ( goto goto_action_1 );
// $action === 2 and process_recording( 'goto_action_2' ) . ( goto goto_action_2 );
// $action === 1 and process_recording( 'goto_action_1' ) . goto(
'goto_action_1' );
// $action === 2 and process_recording( 'goto_action_2' ) . goto(
'goto_action_2' );
//-------------------------------------------------
// LOOKS UGLY, BUT WORKS
//-------------------------------------------------
if ( $action === 1 ): process_recording( 'goto_action_1' ); goto goto_action_1; endif;
if ( $action === 2 ): process_recording( 'goto_action_2' ); goto goto_action_2; endif;
exit;
goto_action_1: echo 'action_1' . PHP_EOL . exit;
goto_action_2: echo 'action_2' . PHP_EOL . exit;
goto_end_of_file: echo 'end_of_file' . PHP_EOL . exit;
?>
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=77776&edit=1