PHP - Indirect modification of overloaded property

前端 未结 8 1675
悲哀的现实
悲哀的现实 2020-11-28 08:38

I know this question has been asked several times, but none of them have a real answer for a workaround. Maybe there\'s one for my specific case.

I\'m building a map

8条回答
  •  独厮守ぢ
    2020-11-28 09:10

    I agree with VinnyD that what you need to do is add "&" in front of your __get function, as to make it to return the needed result as a reference:

    public function &__get ( $propertyname )
    

    But be aware of two things:

    1) You should also do

    return &$something;
    

    or you might still be returning a value and not a reference...

    2) Remember that in any case that __get returns a reference this also means that the corresponding __set will NEVER be called; this is because php resolves this by using the reference returned by __get, which is called instead!

    So:

    $var = $object->NonExistentArrayProperty; 
    

    means __get is called and, since __get has &__get and return &$something, $var is now, as intended, a reference to the overloaded property...

    $object->NonExistentArrayProperty = array(); 
    

    works as expected and __set is called as expected...

    But:

    $object->NonExistentArrayProperty[] = $value;
    

    or

    $object->NonExistentArrayProperty["index"] = $value;
    

    works as expected in the sense that the element will be correctly added or modified in the overloaded array property, BUT __set WILL NOT BE CALLED: __get will be called instead!

    These two calls would NOT work if not using &__get and return &$something, but while they do work in this way, they NEVER call __set, but always call __get.

    This is why I decided to return a reference

    return &$something;
    

    when $something is an array(), or when the overloaded property has no special setter method, and instead return a value

    return $something;
    

    when $something is NOT an array or has a special setter function.

    In any case, this was quite tricky to understand properly for me! :)

提交回复
热议问题