On Fri, 2008-10-24 at 10:05 -0700, Stanislav Malyshev wrote:
> Hi!
> 
> > nope that would mean that some scripts might work different between 5.2
> > and 5.3, now one gets an error. consider such a script:
> 
> Just so it is clear - some scripts ALREADY work differently, that's why 
> it says "BC break".

There's a difference between "working differently, but doing something"
and "throwing an error".

> > <?php
> > class Foo extends ArrayAccess {
> >     public $prop = 42;
> >     function offsetGet($n) { ... }
> >     ....
> > }
> > 
> > $o = new foo;
> > array_key_Exists('prop', $o);
> > ?>
> > 
> > In <= 5.2 it will return the value of $o->prop, in 5.3 it would call the
> > offsetGet() method. 
> 
> In 5.2 it would return true and not the value of $o->prop.
> In 5.3 I don't think it would call offsetGet. It would call 
> get_properties method of ArrayAccess, and that should return list of 
> object's properties as array, so in this case the return will still be true.

I didn't check array_key_exists but most of the affected functions use
Z_OBJ_HT and therefore directly access the property table, not the
property access APIs.

Now changing to these APIs will be a silent change, whereas the old
behavior might be considered as a bug, throwing an error might be a good
compromise.

Example showing the 3 different behaviors:

$ cat array_key_exists_array_access.php
<?php
class Test implements ArrayAccess {
    public $prop = "property";

    public function offsetExists($key) {
        echo __METHOD__,"($key)\n";
        return false;
    }

    public function offsetGet($key) {
        echo __METHOD__,"($key)\n";
        return null;
    }

    public function offsetSet($key, $value) {}
    public function offsetUnset($key) {}
}

$o = new Test();
var_dump(array_key_exists("prop", $o));
?>

1)
$ php52 array_key_exists_array_access.php
bool(true)

2)
$ php53 array_key_exists_array_access.php

Warning: array_key_exists() expects parameter 2 to be array, object
given in /home/johannes/public_html/- on line 20
NULL

3)
Result after using ArrayAccess:

Test::offsetExistst(prop)
bool(false)


Going from 1) to 3) will certainly confuse users and leads to changes in
behavior which can't be found in an easy way...

johannes


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to