TL;DR
// 従来通りこう書いても
(new Foo)->bar();
// newを省略してもいいようにする
Foo()->bar();
※「結局、関数内で new 使ってるやんけ!」っていうのは大目に見てください
こんなことがあった
ワイ「 Python とか Swift とかインスタンス化するときに new 演算子いらない言語素敵」
ワイ「メソッドチェーンするときにこうやって括弧しなくていい!」
(new Foo)->bar();
???「 new 演算子の結合の問題」
???「なので new Foo().bar()
と書いてPHPの (new Foo)->bar()
と同じ評価になる言語もある」
ワイ「そういう言語もあるんですね」
???「 JavaScript っていう言語がそう」
ワイ「たしかに!!」
ワイ「 Java も同じこと出来ました」
ワイ「 PHP の方が特殊だったんですね」
???「 new とか余分なキーワードがない方が演算子結合順とか考えずに済んで曖昧さが減るのは完全にその通り」
ワイ「動的にメモリを確保するぞ!使い終わったから解放するぞ!って明示的に書く言語以外は new いらないのではと思ってる(過激派)」
PHPでも括弧なしでインスタンス化してメソッドチェーンする
よくあるインスタンス化するための静的メソッドをつくるやつ
class Foo
{
public static function make(): static
{
return new static();
}
public function bar() {}
}
Foo::make()->bar();
たしかにこう書けば new 使わない
でも静的メソッド呼んでいる感がつよい
クラス名と関数名が被っていてもいい
こうも書ける
class Foo
{
public function bar() {}
}
function Foo(): Foo
{
return new Foo();
}
Foo()->bar();
やったぜ
実用性
ないです
use でインポートするとき
インポートするシンボルが、クラスか関数かで書き方が違う
// クラスのインポート
use MyNameSpace\Foo;
// 関数のインポート
use function MyNameSpace\Foo;
そのため「newは書いても書かなくてもいい」にするには、インポートせずに 完全修飾名 で書く必要がある
(new \MyNameSpace\Foo())->bar();
\MyNameSpace\Foo()->bar();
つらいですね