Re: Could this be a bug?
| From: | Thijs Lensselink | 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: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..On 09/14/2010 12:16 AM, Camilo Sperberg wrote: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.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 = '') {
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 !