Re: Explicit constructor call and polymorphic dispatch
| From: | Tim Bezhashvyly | Date: | Thu, 12 Jan 2017 21:34:44 +0000 |
| Subject: | Re: Explicit constructor call and polymorphic dispatch | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-97734@lists.php.net to get a copy of this message | ||
Hi Marco,
the only reason for prohibiting explicit __construct calls is that it makes PHP objects mutable and
it's state unpredictable. Still would like to give this RFC a try.
And what about polymorphic dispatch?
Regards,
Tim
> On 12 Jan 2017, at 21:35, Marco Pivetta <ocramius@gmail.com> wrote:
>
> 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
> <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://twitter.com/Ocramius>
>
> http://ocramius.github.com/
> <http://ocramius.github.com/>
>
> On Thu, Jan 12, 2017 at 8:11 AM, Tim Bezhashvyly <tim.bezhashvyly@gmail.com
> <mailto:tim.bezhashvyly@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
> <http://www.php.net/unsub.php>
>
>