ID:               29917
 Updated by:       [EMAIL PROTECTED]
 Reported By:      dasch at ulmail dot net
 Status:           Wont fix
 Bug Type:         Feature/Change Request
 Operating System: *
 PHP Version:      5.*
 Assigned To:      Andi
 New Comment:

PHP doesn't become inconsistent. It only doesn't allow to check for the
presense of virtual proeprties using isset()/empty(). 

The problem is that we cannot allow the consistency because that would
mean that we need to call __get() for every isset/empty property check
where the property is no declared. Also defining a __exists has the
same problem. Still we would need to call it for every non declared
property. So that is both a major slow down which we cannot overcome by
some __get/__set optimizations.


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

[2004-09-09 14:27:06] fch at hexanet dot fr

The problem was not that __set() and __get() are slow.
The problem is that, if __get() and __set() are defined in an object,
PHP becomes "unconsistent", that is to say that some functions like
isset() have not these usual behavior if __get() and __set() are
defined in an object.
And abstract properties is a very strange concept...
However, a __get() and __set() optimization is a good idea.

Fred.

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

[2004-09-03 20:30:43] [EMAIL PROTECTED]

We'd need to all __get() for every non existing property then which
would be worse than only a mahor slowdown.
Een a __exists() would'n help much because that, too. Would be very
slow. The only way out would be to declare abstract properties as
allowed by this patch:

http://marcus-boerger.de/php/ext/ze2/ze2-abstract-properties-20040803.diff.txt


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

[2004-09-03 13:48:23] fch at hexanet dot fr

<?php

class foo implements arrayAccess
{
   private $array = array();

   function __construct() {}

   function __get($key)
   {
      return $this->offsetGet($key);
   }

   function __set($key, $value)
   {
      $this->offsetSet($key, $value);
   }

   function offsetExists($key)
   {
      return isset($this->array[$key]);
   }

   function offsetGet($key)
   {
      return $this->array[$key];
   }

   function offsetSet($key, $value)
   {
      $this->array[$key] = $value;
   }

   function offsetUnset($key)
   {
      unset($this->array[$key];
   }
}

$foo = new foo();

echo (isset($foo['bar']) == true ? 'set' : 'not set');
$foo['bar'] = 'bar';
echo (isset($foo['bar']) == true ? 'set' : 'not set');
echo $foo['bar'];

#Expected result :
# not set
# set
# bar
#Real result
# not set
# set
# bar
# !! GREAT !!

#Now, the same thing with __get() and __set()

unset($foo);
$foo = new foo();

echo (isset($foo->array) == true ? 'array is set' : 'array is not
set');
echo (isset($foo->bar) == true ? 'bar is set' : 'bar is not set');
$foo->bar = 'bar';
echo (isset($foo['bar']) == true ? 'bar is set' : 'bar is not set');
echo $foo->bar;

#Expected result :
# array is set
# bar is not set
# bar is set
# bar
#Real result
# array is set # Ok !
# bar is not set # Ok !
# bar is not set # PROBLEM PROBLEM
# bar
# !! NOT GREAT !!

?>

It is abnormal !
isset() does not return the good value on property wich was set with
__set() it is return the good value on property wich was set in the
class,and isset() return the good value on value wich was set with
offsetSet() method !!
It is a paradox !

I think that isset MUST return the same value in all case.

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

[2004-09-01 13:51:05] dasch at ulmail dot net

If the isset() function aren't going to work with properties accessed
with a __get() call, then there should at least be a __isset() method
that allows for custom isset()-handling. eg:

    <?php

    class Foo
    {
        private $bar = "bar";

        public function __isset ($prop)
        {
            if (isset($this->$prop)) {
                return TRUE;
            } else {
                return FALSE;
            }
        }
    }

    $foo = new Foo();

    echo isset($foo->bar) ? "yes\n" : "no\n";

    // Should be the same as

    echo $foo->__isset('bar') ? "yes\n" : "no\n";

    ?>

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

[2004-09-01 10:24:01] fch at hexanet dot fr

Can you explain where are wrong ???

A call to __set() create a property in the object (see documentation).
Event if this property is not a real member property for PHP language
point of view, for the programers point of view, it is a property !

So, isset() MUST return true in my example.

What are difference between your example :

$o->a = 'bar';
echo isset($o->a) ? "yes\n" : "no\n";

And my example :

$o->foo = 'bar';
echo (isset($o->foo) == true ? 'foo is set' : 'foo is not set');

There is no difference ! Except that my foo property was created with a
__set() call.

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

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/29917

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

Reply via email to