On 1/12/2017 8:19 AM, Sebastian Bergmann wrote:
> Am 12.01.2017 um 08:11 schrieb Tim Bezhashvyly:
>> Disallow explicit call of __construct method
> 
> I am baffled that this (still) works:
> 
> $ cat /tmp/t.php
> <?php
> class C
> {
>     public function __construct()
>     {
>         print __METHOD__ . PHP_EOL;
>     }
> }
> 
> $o = new C;
> $o->__construct();
> 
> 
> $ php /tmp/t.php
> C::__construct
> C::__construct
> 
> 
> $ php --version
> PHP 7.1.0 (cli) (built: Dec  1 2016 07:39:00) ( NTS )
> Copyright (c) 1997-2016 The PHP Group
> Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies
> 
> I am in favor of an RFC to disallow explicit invocation of interceptor
> methods such as __construct().
> 
> Can we do this in PHP 7.2 or does this have to wait for PHP 8?
> 

https://github.com/php/php-langspec/blob/master/spec/14-classes.md#constructors

> Constructors are called by object-creation-expression and from within
> other (derived class) constructors.

This suggests that creation is possible via the `new` keyword only and
not via explicit calls to `__construct`. Hence, it could be categorized
as unspecified and dropped in 7.2.

However, there are other oddities that probably should be addressed too
in the context of constructors which are actually defined and thus can
only be removed in PHP 8.

> A constructor can return a result, by value or byRef.

> A constructor should not call its base-class constructor more than
> once.

```
<?php
// test.php

class A {

  function __construct() {
    echo __CLASS__ , "\n";
  }

}

class B extends A {

  function __construct() {
    parent::__construct();
    echo __CLASS__ , "\n";
    parent::__construct();

    return "PHP\n";
  }

}

$b = new B;
echo $b->__construct();
```

```
$ php test.php
A
B
A
A
B
A
PHP
```

Note that both PHP and HHVM implement this _correctly_:

https://3v4l.org/DFGCa

-- 
Richard "Fleshgrinder" Fussenegger

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to