Edit report at https://bugs.php.net/bug.php?id=71419&edit=1
ID: 71419
Comment by: wegvonhier+phpbugs at gmail dot net
Reported by: andreas at dqxtech dot net
Summary: Allow ::new() syntax.
Status: Open
Type: Feature/Change Request
Package: Class/Object related
PHP Version: 7.0.2
Block user comment: N
Private report: N
New Comment:
I believe the correspondig rfc for that change is this one: https://wiki.php.net/rfc/context_sensitive_lexer
(allowing reserved words such as new in more contexts, the rfc even has an example using
Collection::new()->method())
Anyway, you could use a trait to make your wished pattern easier to implement (on 7.0+):
https://3v4l.org/ZQLSk
Previous Comments:
------------------------------------------------------------------------
[2016-01-20 13:06:05] andreas at dqxtech dot net
Description:
------------
I often create classes that have a normal constructor, and one or more static factory methods.
On instantiation, I need to decide between "new C()" and "C::create()".
For method chaining, the "new C()" needs additional brackets, like so: "(new
C())".
Switching between the two notations can be annoying.
Proposal: Allow a syntax "C::new()", which would be equivalent to "(new C())".
--------
Now.. when I had this idea, I was not aware that since PHP 7, and also in hhvm, it is possible to
name a method like "new()".
https://3v4l.org/Pp68v with user-defined method new().
https://3v4l.org/YvjJ9 without such a method.
This is unfortunate, and makes this request difficult, if not impossible.
A remaining (but not really great) option would be to give every class an "implicit"
static method ::new(), but allow this method to be overridden.
Maybe this was already discussed and discarded, and this is the reason why a method named
"new()" is now allowed. In this case I would like this to be considered a support request.
The answer could be a link to the discussion where this was decided.
Test script:
---------------
<?php
class C {}
class D {
/**
* Allowed since PHP 7
*/
static function new() {return NULL;}
}
// Call implicit method new, equivalent to "new C()";
$instance = C::new();
assert($instance instanceof C);
// Call explicit method new.
$null = D::new();
assert($null === null);
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=71419&edit=1