On Fri, Dec 2, 2016 at 4:53 PM, Alex Bowers <bowersb...@gmail.com> wrote:

>
> On 2 December 2016 at 14:46, Andrey Andreev <n...@devilix.net> wrote:
>
>> A magic method is essentially an implicit interface ...
>> The interface itself does nothing. But when it is implemented, the engine
>> will know that the class constructor is public and accepts a single
>> parameter - thus, also knowing that it could try to do a new
>> ClassName($yourParameterHere)
>>
>
> The interface would not work though, because there should be some logic in
> place too. For example, if you accept, but convert an array, or an array of
> arrays etc differently. Or would this be logic that should be placed inside
> of the constructor, and the castable will just offload to a new
> construction?
>

There's no logic in constructing differently from the same input type.
If you handle an array passed to __cast() differently to one passed to
__construct(), your design is inconsistent, to say the least.

The only reason I can think of wanting to do that is if you'd like to
magically create dependencies to pass to the constructor. For example:

    class Foo {

        public function __construct($scalar, Bar $bar)
        {
            // whatever
        }

        public static function __cast($var)
        {
            $bar = new Bar();
            return new static($var, $bar);
        }
    }

However, that is obviously tight-coupling at least one of your
dependencies. I believe most people on the list would agree that this is
not a good thing, but even if that wasn't the case - you could still do it
in the constructor if you really wanted to:

    public function __construct($scalar, Bar $bar = null)
    {
        if ( ! isset($bar)) {
            $bar = new Bar();
        }
    }

Honestly, I don't see how a new method is in any way beneficial.

Cheers,
Andrey.

Reply via email to