PHP の new 演算子とメソッドチェイン [PHP]
オブジェクトに対して右に右にメソッドを書き連ねていく書き方はよくメソッドチェインと呼ばれている。また生成したオブジェクトを変数に結びつけずにすぐにメソッドを呼んで使い捨てるという書き方がコードの簡潔さの上で好ましい事もある。
Ruby だとこういう感じだ。
irb(main):013:0> class Foo irb(main):014:1> def method() print "hello!\n" end irb(main):015:1> end => nil irb(main):016:0> Foo.new.method() hello! => nil
Python でもできる。
>>> class Foo: ... def method(self): ... print "hello!" ... >>> Foo().method() hello!
C++ ですらできる(でもメモリリークします)。
#include <iostream>
class Foo {
public:
void method()
{
std::cout << "hello!\n";
}
};
int main(int, char*[])
{
new Foo()->method();
return 0;
}
それが PHP では…
<?php
class Foo {
public function method() {
print("hello!");
}
}
new Foo->method();
?>
F:\>php tryme.php PHP Parse error: parse error, unexpected T_OBJECT_OPERATOR in F:\tryme.php on l ine 9
できない! こういう仕様なのかな。括弧で囲んでもだめみたいなので下みたいに生成用のメソッドを静的メソッドで作るのがいいのかもしれない。
<?php
class Foo {
public static function create() {
return new Foo;
}
public function method() {
print("hello!\n");
}
}
Foo::create()->method();
?>
C++では以下のように書けばメモリリークしないです。
int main(int, char*[])
{
Foo().method();
return 0;
}
by どよび (2007-03-12 17:16)
あれ、そうですね。なんか new を使わない場合は無名でインスタンス化できないかのような思い込みがあったようです。ありがとうございます。
by ether (2007-03-13 23:04)