SSブログ

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();

?>

nice!(0)  コメント(2)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 2

どよび

C++では以下のように書けばメモリリークしないです。

int main(int, char*[])
{
 Foo().method();
 return 0;
}
by どよび (2007-03-12 17:16) 

ether

あれ、そうですね。なんか new を使わない場合は無名でインスタンス化できないかのような思い込みがあったようです。ありがとうございます。
by ether (2007-03-13 23:04) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。