php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #50813 __isset() not called for uninitialized array offsets $obj->test[0]
Submitted: 2010-01-21 09:10 UTC Modified: 2016-03-26 11:17 UTC
Votes:2
Avg. Score:2.5 ± 1.5
Reproduced:2 of 2 (100.0%)
Same Version:0 (0.0%)
Same OS:0 (0.0%)
From: marc dot bennewitz at giata dot de Assigned: nikic (profile)
Status: Closed Package: Scripting Engine problem
PHP Version: 5.*, 6 OS: *
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: marc dot bennewitz at giata dot de
New email:
PHP Version: OS:

 

 [2010-01-21 09:10 UTC] marc dot bennewitz at giata dot de
Description:
------------
On testing if an array key is available on an overloaded object variable it doesn't check __isset before calling __get to get the variable for checking the array key.

Reproduce code:
---------------
class MyClass
{

    public function __isset($varname)
    {
        echo 'isset' . PHP_EOL;
        return false;
    }

    public function __get($varname)
    {
        trigger_error('Key "' . $varname . '" does not exist', E_USER_NOTICE);
    }

}

$obj = new MyClass();
var_dump( isset($obj->test[0]) );

Expected result:
----------------
isset
bool(false)

Actual result:
--------------
PHP Notice:  Key "test" does not exist in /tmp/test.php on line 14

Notice: Key "test" does not exist in /tmp/test.php on line 14
bool(false)

Patches

31Jan2011_50813.diff_zend_object_handlers.c (last revision 2011-02-01 06:53 UTC by mjk at emmjaykay dot org)

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2010-01-21 09:59 UTC] jani@php.net
Please try using this snapshot:

  http://snaps.php.net/php5.3-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/


 [2010-01-21 12:03 UTC] marc dot bennewitz at giata dot de
Thats the same:

>php -v
PHP 5.3.3-dev (cli) (built: Jan 21 2010 12:52:05)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

>php test.php
PHP Notice:  Key "test" does not exist in /tmp/test.php on line 14

Notice: Key "test" does not exist in /tmp/test.php on line 14
bool(false)
 [2011-02-01 07:55 UTC] mjk at emmjaykay dot org
I'm not so sure this patch is kosher since it checks the return value's lval from the call to zend_std_call_issetter(). I don't see it in other code.
 [2011-02-01 08:40 UTC] mjk at emmjaykay dot org
In my change, if I comment out the __isset definition, I get

Fatal error: Couldn't find implementation for method MyClass::__isset in Unknown on line 0

where as on the unchanged code, I get 

Notice: Key "test" does not exist in /home/mjk/php-5.3.5.orig/e.php on line 22
bool(false)

I'm not sure if that's correct or not.
 [2016-03-26 11:17 UTC] nikic@php.net
-Status: Verified +Status: Closed -Assigned To: +Assigned To: nikic
 [2016-05-04 23:15 UTC] sm0ke999 at yandex dot ru
Here valid link: https://github.com/php/php-src/commit/373da7aa6f5e7bf57d434fd449f97770fb479d3e

Dot in the end made link invalid in previous comment.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 15:01:30 2024 UTC