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 <[email protected]>
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
>
>