Re: Old style constructors in PHP-8
| From: | Nikita Popov | Date: | Wed, 30 Jan 2019 11:41:45 +0000 |
| Subject: | Re: Old style constructors in PHP-8 | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-103893@lists.php.net to get a copy of this message | ||
On Wed, Jan 30, 2019 at 12:11 PM Dmitry Stogov <dmitry@zend.com> wrote:
> Hi,
>
>
> I've just noticed that Wordpress-4.1 on PHP master started silently
> produce different output.
>
> The problem that PHP master started to ignore old-style constructors.
>
> They were deprecated in PHP-7 and PHP produced the following warning
>
>
> Deprecated: Methods with the same name as their class will not be
> constructors in a future version of PHP; ... has a deprecated constructor
>
>
> PHP master doesn't produce any warnings and just constructs a class
> without constructor.
>
> This silent behavior change may become a problem for porting legacy code
> to PHP-8,
>
> May be, it makes sense to emit fatal error in case of old-style
> constructor.
>
>
> Thanks. Dmitry.
>
First of all, it is probably important to note that the RFC for this (
https://wiki.php.net/rfc/remove_php4_constructors)
explicitly specifies
that in PHP 8 methods with the same name as the class are interpreted as
ordinary methods and no warning or error is thrown. I've CC'd Levi and
Andrea, who authored this RFC.
I think as an end goal, what the RFC specifies is preferable for a number
of reasons:
* You should be able to call your methods whatever you like. PHP only
reserves the __ prefix for itself.
* The behavior is consistent with classes inside namespaces, where methods
with the same name as the class are treated as normal methods for a long
time already.
* The fact that a method has the same name as the class may be completely
incidental if it comes from a trait (see
https://bugs.php.net/bug.php?id=77470). The
trait does not control in which
classes it may be used and which names those classes may have.
Of course, porting of legacy code is a legitimate concern. I think the
relevant question in that regard is: How likely is it that people will port
code directly from PHP 5 to PHP 8, without ever running it on PHP 7, where
this generates deprecation notices? Not very, I think.
Finally, it should be mentioned that finding old style constructors is
trivial with static analysis, and I believe that a lot of code style
checker and analyzers already support this functionality since the release
of PHP 7.0.
Nikita