From:             kevin at hatry dot com
Operating system: irrelevant
PHP version:      4.3.2
PHP Bug Type:     Scripting Engine problem
Bug description:  return in included files as not always the same behaviour

Description:
------------
First i'll describe the more or less documented way of doing:

- When putting a return in an included file, the execution of the file
stops and returns to the parent file (all normal), but functions defined
in the included file are nontheless put in the environnement (they are
callable in the parent file). OK i understand that: functions are added in
the environnement at parsing time (so before execution time).

- When including two times the same file which defines a function, i get a
fatal error saying the function is already defined. (which is normal).

But when you mix both, ie: an included file defining a function with a
return at the beginning and that you include that file two times you dont
have the fatal error: php seems to ignore the second declarations.

Of course the example is trivial but it wotks the same if the includes are
done in separate files.

A last remark: if you add code after the return, it will never be executed
(that's normal) whereas the function will exists which is disturbing : i
spent half an hour wondering why my $GLOBALS affectation put after the
return (which was in an if statement) didnt appear even when i could use
the function !

Even if it's not considered as a bug i think it should be properly
documented.

Thanks.

Reproduce code:
---------------
<?php
// this is the included file: "inc.php" **************
return;

function dummy () { return 2; }
?>

and, the main file:
<?php
require('./inc.php');
require('./inc.php');

if( function_exists('dummy') ) { echo 'function: yes'."\n"; }
else { echo 'function: no'."\n"; }
?>

Expected result:
----------------
Fatal error: Cannot redeclare dummy() (previously declared in inc.php:5)
in inc.php on line 5


Actual result:
--------------
if the return statement is left uncommented:

function: yes

so the function exists despite the return.


if the return statement is commented:

Fatal error: Cannot redeclare dummy() (previously declared in inc.php:5)
in inc.php on line 5

which should be the normal behaviour in both cases, i think.

-- 
Edit bug report at http://bugs.php.net/?id=26032&edit=1
-- 
Try a CVS snapshot (php4):  http://bugs.php.net/fix.php?id=26032&r=trysnapshot4
Try a CVS snapshot (php5):  http://bugs.php.net/fix.php?id=26032&r=trysnapshot5
Fixed in CVS:               http://bugs.php.net/fix.php?id=26032&r=fixedcvs
Fixed in release:           http://bugs.php.net/fix.php?id=26032&r=alreadyfixed
Need backtrace:             http://bugs.php.net/fix.php?id=26032&r=needtrace
Try newer version:          http://bugs.php.net/fix.php?id=26032&r=oldversion
Not developer issue:        http://bugs.php.net/fix.php?id=26032&r=support
Expected behavior:          http://bugs.php.net/fix.php?id=26032&r=notwrong
Not enough info:            http://bugs.php.net/fix.php?id=26032&r=notenoughinfo
Submitted twice:            http://bugs.php.net/fix.php?id=26032&r=submittedtwice
register_globals:           http://bugs.php.net/fix.php?id=26032&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=26032&r=php3
Daylight Savings:           http://bugs.php.net/fix.php?id=26032&r=dst
IIS Stability:              http://bugs.php.net/fix.php?id=26032&r=isapi
Install GNU Sed:            http://bugs.php.net/fix.php?id=26032&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=26032&r=float

Reply via email to