Proposal:

Two additional magic methods for PHP objects -

__refer(void):

Refer method is called whenever object's identifier is assigned to
variable, if such method is present.
Example:

$foo = new Bar;
$bar = $foo; //__refer invoked

Return values: null to proceed by assigning the variable to objects
identifier. Any other value returned would be assigned to variable
which is to hold the reference in case of null.

__unrefer($var):

Unrefer method would be called whenever object's identifier is about
to be replaced by anything else and would hold that something else as
argument.
Example:

$foo = new Bar;
$foo = false; //__unrefer invoked with false as argument

Return values: null to proceed with default by replacing value, false
to not to replace value and keep the reference in variable.

Real life use sample:

class SomeObject{
    protected $count;
    function __refer(){
        $this->count++;
    }
}

$foo = new Bar;
$bar = $foo;
$foobar = $bar; //SomeObject::$count = 2

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

class SomeCustomString{
    protected $value;
    function __unrefer($value){
        if(is_string($value)){
            $this->value = $value;
        }
        throw new UnexpectedValueException('This object can only hold strings');
    }
}

$foo = new SomeCustomString;
$foo = 1;

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

Although I can't think of many uses to __refer I however can think of
one very useful use case for __unrefer - custom "types". I actually
did borrow the __unrefer functionality from SPL_Types PECL package
when trying to solve problem of how to validate contents of object
properties which are going to be set by other party and cant be
validated via set or get. I know there are ways to do this, but none
seemed pretty enough for me to actually implement.

Any feedback on this is very welcome, especially from core developers
and potential users. What would be the issues, potential drawbacks,
other?

Separate question to core developers would be, how hard it would be to
implement such functionality, or is this even possible with reasonable
effort?

Thanks, regards
Matiss Roberts Treinis <mrtreinis at gmail dot com>

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

Reply via email to