> On Jul 11, 2021, at 7:19 PM, Larry Garfield <la...@garfieldtech.com> wrote:
> 
> What are the use cases for integrated object to object (ie, class to class) 
> conversion in PHP?  
> I'm not entirely clear on what the use case is in PHP.  When would that be 
> superior to "just write an asFoo() method and move on with life"?

Reading your question triggered the following thoughts. They are not use-case's 
per-se because I can't remember them, but I know I have felt the need for these 
each at least once, and especially the last one.  

Note that you cannot currently do any of these with an asFoo() method, at least 
not directly.

1. It would be nice to be able to create a new instance of a parent, 
grandparent class, etc. class given the properties of a child class instance. 
Maybe:

class Progenitor {
    public $surname;
    function __construct($surname) {
        $this-> surname = $surname;
    }
}
class Offspring extends Progenitor {}
$offspring = new Offspring('Schinkel');

$progenitor = clone $offspring asinstanceof Progenitor
echo get_class($progenitor);  // prints: Progenitor
echo $progenitor->surname;  // prints: Schinkel

2. Similarly it would be nice to be able to treat an object as an instance of 
its parent/grandparent/etc. where (parentof $instance) === $instance

$progenitor = $offspring asinstanceof Progenitor
echo get_class($progenitor);                               // prints: Progenitor
echo $progenitor === $offspring ? 'frue' : 'false;  // prints: true

Note I have no idea if having two instances where references are equal but they 
are different classes would have unintended consequences, so this might not be 
a good idea, not sure.  But it would be nice to be able to treat an object as 
its parent from time to time, if it is possible.

3. It would also be nice to create a child class starting with an instance of a 
parent as its base.

See example for #5.  It should work the same.

4. Similarly it might be nice to be able to (somehow) assign a child class' 
identity and properties to an instance of its parent/grandparent/etc. where 
(childof $instance) === $instance although I have absolutely no idea how it 
this would work syntactically.

???

5. And probably the functionality I've wanted most in this area — which is 
admittedly only tangentially-related — is to be able to assign to $this so we 
could do something like clone an object to get an equivalent object. Or if case 
#1 or #2 above was possible, by cloning an instance of its 
parent/grandparent/etc. would initialize for that object.  For example:

class Foo {
    public $value;
    function __construct(int $value) {
        $this->value = $value;
    }
    function fromFoo(Foo $foo) {
        $this = clone $foo;   // <-- assigning $this replaces all state to be 
equal to the cloned instance
    }
}
$f1 = new Foo(100);
$f2 = new Foo(0);
$f2->fromFoo($f1);
echo $f2->value;  // prints 100

> Scalar conversion I can see, but every time someone suggests adding siblings 
> to __toString(), there's major pushback.

Look ma, no magic methods!  :-)

-Mike

Reply via email to