Heya,

While I agree that it is weird to be able to call constructors more than
once, this is generally used for:

 * lazy loading
 * resource reset

Specifically, what is going on is something like following:<?php

final class DbConnection
{
    private $dsn;
    private $initializer;
    public function __construct(string $dsn)
    {
        $this->dsn = $dsn;
        // socket stuff happens here, much like with PDO
    }

    public function query(string $queryString) : array
    {
        ($this->initializer)();
        // irrelevant from here on
        return ['query' => $queryString, 'dsn' => $this->dsn];
    }

    public static function lazyInstance(string $dsn) : self
    {
        $instance = (new
ReflectionClass(self::class))->newInstanceWithoutConstructor();
        $instance->initializer = function () use ($dsn, $instance) {
            $instance->__construct($dsn);
            $instance->initializer = function () {
            };
        };
        return $instance;
    }
}

$instance = DbConnection::lazyInstance('mysql://something');

var_dump($instance);

var_dump($instance->query('SELECT * FROM foo'));
var_dump($instance->query('SELECT * FROM bar'));

Here's an example of it at work: https://3v4l.org/Y0eoL

The pattern is simple:

 * intercept constructor call
 * capture constructor parameters
 * instantiate without constructor
 * defer constructor call for later

The same can be used in a myriad of different ways, but this is a legit
use-cases that generally don't involve coding everything into the same
class (and I generally advise against doing that anyway).

Therefore I don't see a reason to drop manual constructor calls, unless
there is a strong necessity to get rid of 'em.



Marco Pivetta

http://twitter.com/Ocramius

http://ocramius.github.com/

On Thu, Jan 12, 2017 at 8:11 AM, Tim Bezhashvyly <tim.bezhashv...@gmail.com>
wrote:

> Dear internals,
>
> I would like to propose 2 RFCs:
>
> - Disallow explicit call of __construct method
> - Polymorphic dispatch
>
> I'm sure I'm not the first who came with those 2 ideas so in case those
> were already proposed and rejected just let me know.
>
> Otherwise please bless me with mana which will allow me to submit them.
>
> Regards,
> Tim
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

Reply via email to