Re: Could this be a bug?

From: Date: Wed, 15 Sep 2010 06:17:48 +0000
Subject: Re: Could this be a bug?
References: 1 2 3 4  Groups: php.general 
Request: Send a blank email to php-general+get-308081@lists.php.net to get a copy of this message
On 09/14/2010 11:31 PM, Camilo Sperberg wrote:
On Tue, Sep 14, 2010 at 02:46, Thijs Lensselink<dev@lenss.nl> wrote:
On 09/14/2010 08:33 AM, Thijs Lensselink wrote:
On 09/14/2010 12:16 AM, Camilo Sperberg wrote:
I have some really strange behaviour going on here, and I think it could be a (minor) PHP's bug. I am not really sure about what happens internally, but my best guess would be that after a memory exhaustion, when I try to execute a custom error handler with the register_shutdown_function (which is executed even after a fatal error) and try to access the element that provoked the memory exhaustion, no error should raise instead of *Uninitialized string offset: 0. I have prepared a little test case to reproduce the error and (I hope) can explain the error. <?php date_default_timezone_set('America/Santiago'); ini_set('memory_limit','1M'); ini_set('display_errors',1); error_reporting(-1); function my_error_handler($errno = '0', $errstr = '[FATAL] General Error', $errfile = 'N/A', $errline = 'N/A', $errctx = '') {
This seems to be your error. You set $errctx to be a string. But later on you use it as an array. Remove the = '' part. And it will function as expected.
You're right... However I don't like leaving non-default value in functions so I did something like if(empty($errctx)) $errctx = array() in the first line of the custom error handler which threw out the error message and everything works ok now. I think from 5.2 and up you can use the array keyword to force an array as parameter..
But -and correct me if I'm wrong- isn't isset (or empty) supposed to return a FALSE whenever that variable doesn't exist? With your help, I could reduce the test case into: $asdf = 'hello world'; if (empty($asdf[4]['inventing'])) echo 'nice little world'; if (isset($asdf['inventing'][6])) echo 'little nice world'; // This works ok. This works because the string $asdf is set with a value. So $asdf[4] exists but ['inventing'] doesn't so it will return false
$asdf = ''; if (empty($asdf[4]['inventing'])) echo 'nice little world'; if (isset($asdf['inventing'][6])) echo 'little nice world'; // This returns E_NOTICE This doesn't work because the string $asdf is empty. So calling $asdf[4] will trigger a notice since there is no 4th character
Shouldn't these 2 examples work exactly the same way? (AKA as Nº 1). If not... why not? Both are string types, onyl difference is that one has no characters in it while the other does, but essentialy they are both the same. Greetings !


« previous php.general (#308081) next »