|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2015-09-22 07:04 UTC] vovan-ve at yandex dot ru
Description:
------------
PHP 5.4 allowed us to chain member assess to `new Foo`, but there must be parens:
(new Foo)->bar();
(new Foo(42, 37))->bar();
something((new Foo(42, 37))->lorem()->ipsum()->dolor());
Why do we need that redundant parenses? Compare what ECMAScript allows - you know:
new Foo().method();
new Foo().field;
new some.where.Foo().method();
new Foos[i]().method();
new (anything)().method();
PHP 7 should to remove redundant parens.
Test script:
---------------
class Foo {
protected $id;
public function __construct($id) {
echo "new ", get_called_class(), "($id)\n";
$this->id = $id;
}
public function __toString() {
return get_class($this) . "{" . $this->id . "}";
}
public function bar($x) {
echo $this, "->", __FUNCTION__, "($x)\n";
return $this;
}
public function val($x) {
echo $this, "->", __FUNCTION__, "($x) => $x\n";
return $x;
}
public function lorem(self $foo, $x) {
echo $this, "->", __FUNCTION__, "($foo, $x)\n";
$foo->bar($x);
return $this;
}
}
new Foo(10)->bar(20)->bar(30)->bar(new Foo(40)->val(50));
new Foo(60)->lorem(new Foo(70)->bar(80), new Foo(90)->val(100));
// same as
// (new Foo(10))->bar(20)->bar(30)->bar((new Foo(40))->val(50));
// (new Foo(60))->lorem((new Foo(70))->bar(80), (new Foo(90))->val(100));
Expected result:
----------------
new Foo(10)
Foo{10}->bar(20)
Foo{10}->bar(30)
new Foo(40)
Foo{40}->val(50) => 50
Foo{10}->bar(50)
new Foo(60)
new Foo(70)
Foo{70}->bar(80)
new Foo(90)
Foo{90}->val(100) => 100
Foo{60}->lorem(Foo{70}, 100)
Foo{70}->bar(100)
Actual result:
--------------
Parse error: syntax error, unexpected '->' (T_OBJECT_OPERATOR)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 03 05:00:01 2025 UTC |
We currently allow code like this: $obj = new $foo->bar(); // Meaning: $class = $foo->bar; $obj = new $class(); You are proposing to interpret this as $obj = (new $foo)->bar() instead, which would break backwards compatibility. This could have been changed as part of the UVS RFC, but I felt like this change would be too intrusive and the consequences rather weird. I expect something like `new $foo['bar']` to behave as `new {$foo['bar']}` not `(new $foo)['bar']`.