Bug #75138 [Com]: Nested "IF" triggers Exception when it is before "else:" or "elseif:".

From: Date: Wed, 30 Aug 2017 23:19:02 +0000
Subject: Bug #75138 [Com]: Nested "IF" triggers Exception when it is before "else:" or "elseif:".
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-210890@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=75138&edit=1

 ID:                 75138
 Comment by:         spam2 at rhsoft dot net
 Reported by:        jcmarchi at gmail dot com
 Summary:            Nested "IF" triggers Exception when it is before
                     "else:" or "elseif:".
 Status:             Not a bug
 Type:               Bug
 Package:            *Programming Data Structures
 Operating System:   All
 PHP Version:        Irrelevant
 Block user comment: N
 Private report:     N

 New Comment:

no, i didn't play with the samples on my smartphone BUT DID YOU read the link about
"dangling else"?


Previous Comments:
------------------------------------------------------------------------
[2017-08-30 23:15:36] jcmarchi at gmail dot com

If you are trying to (childishly) offend me, well... Sorry to disappoint you. Why? Because I agree
with you! Some "freedoms" while coding should be chopped out. However, while language
allows it, it should be (at least) bug-free.

What is unbelievable, however, is people that keep focusing on the "wrong wrongs" simply
to ignore the problem at hand. Those are the ones I DO fire (the ones that go to the extreme of
self-blindness simply to avoid accepting they are wrong).

I bet you didn't even play with the code examples... Or even created your own... Did you?

/me -- All hopes for the technology world are lost, forever!

------------------------------------------------------------------------
[2017-08-30 23:12:11] yohgaki@php.net

Searching "dangling else" would help to understand this issue. It's common issue for
languages/programs.

------------------------------------------------------------------------
[2017-08-30 22:58:40] spam2 at rhsoft dot net

frankly, i consider to propose a RFC to disallow such coding styles at all and would fire anybody
writing such code immediately

the same for
if($× === $y) do_something;
without {}

------------------------------------------------------------------------
[2017-08-30 22:38:06] jcmarchi at gmail dot com

OMG... Let me draw a picture!!!!

[ IF (CONDITION):
   [ 
    ANYTHING IN HERE SHOULD BE A NESTED BLOCK FOR THE "IF" CONDITION WHEN IT IS TRUE
   ]

ELSEIF (ANOTHER CONDITION): 
   [ 
    ANYTHING IN HERE SHOULD BE A NESTED BLOCK FOR THE "ELSEIF:" CONDITION WHEN IT IS TRUE
   ]

ELSE: 
   [ 
    ANYTHING IN HERE SHOULD BE A NESTED BLOCK FOR THE "ELSE:" CONDITION WHEN IT IS TRUE
   ]
]

Now, based on the nested blocks above, it should NOT fail when you NEST "whatever"
statement inside!

Each nested block is initiated by the ":" and end when it reaches an "ELSEIF" or
an "ELSE" (each one of those having its own nested blocks again after their own
":"), or an "ENDIF" (when the first "IF" ends).

It said such code should NOT fail:

[ IF (CONDITION):
   [ 
    ANYTHING IN HERE SHOULD BE A NESTED BLOCK FOR THE "IF" CONDITION WHEN IT IS TRUE

   IF (ANOTHER CONDITION) [ DO THIS; ] <--- THIS SHOULD BE NESTED INTO THE SAME LINE
"IF"
   ]

ELSEIF (ANOTHER CONDITION): 
   [ 
    ANYTHING IN HERE SHOULD BE A NESTED BLOCK FOR THE "ELSEIF:" CONDITION WHEN IT IS TRUE
   ]

ELSE: 
   [ 
    ANYTHING IN HERE SHOULD BE A NESTED BLOCK FOR THE "ELSE:" CONDITION WHEN IT IS TRUE
   ]
]

Or, based on your comment, this following logic should run, but provide a wrong result (and it
actually works as expected):

$bar = 'bar';
$foo = 'foo';

if (isset($bar)):
   if (isset($foo)) echo "Both are set.";
   echo " It actually works.";
elseif (isset($foo)):
   echo "Only 'foo' is set.";
else:
   echo "Only 'bar' is set.";
endif;

The above code will return: "Both are set. It actually works.", while based on your
"thinking" it should return blank.

Also, just for thinking purposes, try this (it works):

$bar = 'bar';
$foo = 'foo';

if (isset($bar)):
   echo "It actually works. ";
   { if (isset($foo)) echo "Both are set."; }
elseif (isset($foo)):
   echo "Only 'foo' is set.";
else:
   echo "Only 'bar' is set.";
endif;

Does not matter how you look at it, if a nested IF statement (any coding style) precedes an
"else:" or an "elseif:" statement, a DOUBLE semicolon is required to make it
work (or sub-enclosure it under curly brackets).

I can't believe you cannot see it. More (simplified) examples:

// FAIL:
$bar = 'bar';
if (true):
   if ($bar == 'bar') echo "Got 'bar'.";
else:
   echo "Didn't get 'bar'.";
endif;

// WORKS:
$bar = 'bar';
if (true):
   if ($bar == 'bar') echo "Got 'bar'.";;
else:
   echo "Didn't get 'bar'.";
endif;

// WORKS:
$bar = 'bar';
if (true):
   { if ($bar == 'bar') echo "Got 'bar'."; }
else:
   echo "Didn't get 'bar'.";
endif;

// FAIL:
$bar = 'bar';
if (true):
   if ($bar == 'bar') { echo "Got 'bar'."; }
else:
   echo "Didn't get 'bar'.";
endif;

// WORKS:
$bar = 'bar';
if (true):
   if ($bar == 'bar') { echo "Got 'bar'."; };
else:
   echo "Didn't get 'bar'.";
endif;

------------------------------------------------------------------------
[2017-08-30 22:02:56] spam2 at rhsoft dot net

just take your code, remove any whitespace and look again at it

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    https://bugs.php.net/bug.php?id=75138


--
Edit this bug report at https://bugs.php.net/bug.php?id=75138&edit=1


Thread (19 messages)

« previous php.bugs (#210890) next »