ID:               24915
 User updated by:  tater at potatoe dot com
 Reported By:      tater at potatoe dot com
 Status:           Open
 Bug Type:         Zend Engine 2 problem
 Operating System: OS X 10.2
 PHP Version:      5CVS-2003-11-28 (dev)
 New Comment:

Oh, I see, you just saw the word "private" and threw a mental
exception. OK, here:

class foo
{
    public $_x;
    public function __get($p) { return $this->_x; }
    public function __set($p,$v) { $this->_x = $v; }
}
$y = new foo;
$y->x = 12;
if (empty($y->x))
    print "y->x is empty: {$y->x} \n";
else
    print "y->x is not empty: {$y->x} \n";
if (isset($y->x))
    print "y->x is set: {$y->x} \n";
else
    print "y->x is not set: {$y->x} \n";


Previous Comments:
------------------------------------------------------------------------

[2003-11-29 00:10:05] tater at potatoe dot com

This has nothing to do with accessing private or protected properties.
The very point of __get()/__set() is that there
*is no property at all*. Please try reading the bug description.

------------------------------------------------------------------------

[2003-11-28 21:32:05] [EMAIL PROTECTED]

>From ZEND_CHANGES:

* Private and Protected Members.

    The Zend Engine 2.0 introduces private and protected 
    member variables. Note that for performance reasons no 
    error message is emitted in case of an illegal access to    
    a private or protectecd member variable.


------------------------------------------------------------------------

[2003-10-19 13:49:41] myle34 at hotmail dot com

Another solution could be to make an issetFoo($variable) function:

class foo
{
  ...
  public function issetFoo($variable)
  {
    $variable = '_'.$variable;
    if (isset($this->$variable)) {
      return(TRUE);
    }
    return(FALSE);
  }
}

that should work...

------------------------------------------------------------------------

[2003-09-13 20:50:56] myle34 at hotmail dot com

I have the same problem. What I would ideally like it to do is for
isset to check whether it gets a legitimate (not NULL) value from
__get() and then decide whether the variable passed to isset is set or
not. An alternative could be to have an isset_get or something to check
that it gets a good (not NULL) value returned from the __get()
function.

------------------------------------------------------------------------

[2003-08-02 07:12:58] tater at potatoe dot com

Description:
------------
Given a "property" that is really being handled by __get() and __set()
functions, you are allowed to use it with empty() and isset() without
errors or warnings, but they always report that the property is
empty/not-set.

I understand that this may not be a bug, but a "feature"
of PHP 5 - i.e., just the way it works - but if that is true,
please be kind enough to say so explicitly. It is not helpful
to mark bugs as Bogus with comments like "I suggest you read
ZEND_CHANGES :)"

If it is to be expected, it might be good to throw the
same kind of error that one would see if trying to use 
empty() on a function call, if that's possible.

This is possibly related to bug #24436.

Reproduce code:
---------------
class foo
{
    private $_x;
    private function __get($p) { return $this->_x; }
    private function __set($p,$v) { $this->_x = $v; }
}
$y = new foo;
$y->x = 12;
if (empty($y->x))
    print "y->x is empty: {$y->x} \n";
else
    print "y->x is not empty: {$y->x} \n";
if (isset($y->x))
    print "y->x is set: {$y->x} \n";
else
    print "y->x is not set: {$y->x} \n";

Expected result:
----------------
y->x is not empty: 12 
y->x is set: 12

Actual result:
--------------
y->x is empty: 12 
y->x is not set: 12


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=24915&edit=1

Reply via email to