On Tue, May 11, 2021, at 8:57 AM, Rowan Tommins wrote:
> On 11/05/2021 14:12, Dik Takken wrote:
> > So the use of "new" in initializers would require extending this base
> > class and call the parent constructor. Maybe forgetting to do so could
> > throw, preventing initializers from silently not working.
>
>
> If we managed to get that working, I wonder if we could also include a
> check for uninitialized typed properties, a bit like Swift's "two-phase
> initializers". In short, make this throw an error:
>
> class Foo extends \PHP\Base {
> private Logger $logger;
>
> public function __construct() {
> parent::construct(); // "Error: Property $logger has no default
> and was not initialized before calling Base constructor"
> }
> }
>
> This would catch bugs closer to their source, where currently there is
> no error until $logger is accessed.
>
>
> However, the "if" at the beginning of this message is quite a big one:
> it's not obvious where to assert any of this, because the constructor is
> just called as a normal method *after* the engine considers the object
> to be "created".
In practice, I almost always see the parent constructor called first, then the
child constructor does its own thing. Having the language require you to do it
backwards in order to use a new feature would be... well, not technically a BC
break per se, but certainly invalidating what is currently standard practice.
If I'm following correctly, the concern is cases like this:
class Point {
private Logger $logger = new FancyLogger();
public function __construct(public int $x, public int $y) {
$this->logger->log("Point made.");
}
}
class FancyLogger {
public function __construct() {
$this->db = new DatabaseConnection();
$this->db->write('Logger start.');
}
}
$p1 = new Point(); // This writes "Logger start" then "Point made."
$p2 = unserialize(serialize($p1)); // This writes just "Logger start."
Am I understanding that right? If so, I'm... unclear why that is any more of
an issue than doing it the manual way now.
--Larry Garfield
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php