php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #28845 warning on two TRUE expressions while calling include*() in a if-statement
Submitted: 2004-06-19 20:02 UTC Modified: 2004-10-06 09:02 UTC
From: david dot rech at virusmedia dot de Assigned:
Status: Closed Package: *Directory/Filesystem functions
PHP Version: 4CVS-2004-06-19 (stable) OS: Windows XP SP1
Private report: No CVE-ID: None
 [2004-06-19 20:02 UTC] david dot rech at virusmedia dot de
Description:
------------
I've notice some strange behaviour with include() and include_once() calls in an if-statement whereas two expressions are TRUE and logically combined with the '&&' operator.

While if( true && true ) echo 1; would print out "1" as expected, this code however does not:

if( include_once(__FILE__) && is_integer(1) ) echo 1;

Whereas that code, with the first expression in braces, prints "1" again.

if( (include_once(__FILE__) && is_integer(1) ) echo 1;


In the example you should notice that the expression is still TRUE with other functions - even without braces around first expression.

Also, somehow the result of the second expression gets copied to the first argument of the first expression as an integer.

Look at this warning:

Warning: main(1): failed to open stream: No such file or directory in [...] on line 12

That's what happens if second expression is true and include_once() was'nt put into braces. Try to negate the second expression - you will get a '0' referred as the argument of include_once() in the warning.

So is this some strange magic, or did I've miss the point completely?

Reproduce code:
---------------
<?php
// Expected behaviour
if( true && true ) { // As expected - the expression is TRUE
	echo "1st: That may have worked\n";
}

// Weird behaviour
if( class_exists('stdClass') && is_integer(1) ) { // Again - the expression is TRUE
	echo "2nd: You don't see that, don't you?\n";
}

if( @include_once(__FILE__) && is_integer(1) ) { // Expression seems to be FALSE and causes a weird warning without the @
	echo "3rd: So you see this..?";
}

if( (include_once(__FILE__)) && is_integer(1) ) { // TRUE
	echo "4rd: In fact, you see this...";
}
?>

Expected result:
----------------
1st: That may have worked
2nd: You don't see that, don't you?
3rd: So you see this..?
4rd: In fact, you see this...

Actual result:
--------------
1st: That may have worked
2nd: You don't see that, don't you?
4rd: In fact, you see this...

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2004-06-19 20:04 UTC] david dot rech at virusmedia dot de
Sorry, missed the closing brace in second if-statement...

Must be:

"Whereas that code, with the first expression in braces, prints "1"
again.

if( (include_once(__FILE__)) && is_integer(1) ) echo 1;"
 [2004-10-06 09:02 UTC] david dot rech at virusmedia dot de
Somehow fixed in 4.3.9, and I don't have a clue why. This was also reproduced by another developer.

Did just nobody close the bug or anything? Dunno.

Keep up the good work.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu May 02 11:01:31 2024 UTC