Twitter で知ったんだけど、PHP 5.4 の説明資料がすばらしいとのこと。
[PHP 5.4 - Begin your love affair with traits]
http://www.slideshare.net/predominant/php-54-begin-your-love-affair-with-traits-10118525
分かりやすいし、スライドもきれいで目を引く。
実はクロージャは現版でも実装されてたけど、説明を読んでも使い道が分からず放置してたのが、このスライドの例で理解できた。
が、
は容易に理解できても、
こいつが…
$closure に CustomHandler インスタンスとメソッド名を持った配列を入れとくと、それを echo に渡すと、(たぶん)$handler->sayHello() という動きをするんだと思う。試そうと思ったけど、手元環境は 5.3.9 なので下記エラーが出て動かない。もちろん、[a, b] 表記は旧来どおりの array(a, b) に書き換えてある。
関数やオブジェクトが格納されている番地をコールして、そのときに引数としていくつかのポインタを渡してあげれば、別にそれが文字列であれメソッドであれオブジェクトであれ、結局ポインタには変わりないので、動きのイメージは分かるけど…… うーん…
この例で、sayHello() メソッドに引数を渡したい(Hello Dave と表示させたい)場合には、echo $closure('Dave') にすればいいのかな(もちろんsayHello()メソッドもちょっと変更する)。
クロージャって、インスタンスやら何やらをパックして扱うものと理解してもいいのかなあ。
trait については、インタフェースとクラスの間にある"何か"、という理解をしたんだけど、グローバルスコープの関数だけでなく、プロパティを含めた"何か"にした感じかな。 ただ、インスタンスとして存在するものではないので、結局は定数とグローバル関数で済みそうな気もする。 理解が浅いような気もするけど。
いずれにせよ、5.4 は楽しみ。
[PHP 5.4 - Begin your love affair with traits]
http://www.slideshare.net/predominant/php-54-begin-your-love-affair-with-traits-10118525
分かりやすいし、スライドもきれいで目を引く。
実はクロージャは現版でも実装されてたけど、説明を読んでも使い道が分からず放置してたのが、このスライドの例で理解できた。
が、
$hello = function ($who='') { return "Hello ".$who; } echo $hello()."\n"; echo $hello('Dave'); |
は容易に理解できても、
class CustomHandler { public function syaHello() { echo "Hello"; } } $handler = new CustomHandler(); $closure = [$handler, 'sayHello']; echo $closure(); |
こいつが…
$closure に CustomHandler インスタンスとメソッド名を持った配列を入れとくと、それを echo に渡すと、(たぶん)$handler->sayHello() という動きをするんだと思う。試そうと思ったけど、手元環境は 5.3.9 なので下記エラーが出て動かない。もちろん、[a, b] 表記は旧来どおりの array(a, b) に書き換えてある。
$ ./test.php PHP Fatal error: Function name must be a string in closure.php on line 11 Fatal error: Function name must be a string in closure.php on line 11 |
関数やオブジェクトが格納されている番地をコールして、そのときに引数としていくつかのポインタを渡してあげれば、別にそれが文字列であれメソッドであれオブジェクトであれ、結局ポインタには変わりないので、動きのイメージは分かるけど…… うーん…
この例で、sayHello() メソッドに引数を渡したい(Hello Dave と表示させたい)場合には、echo $closure('Dave') にすればいいのかな(もちろんsayHello()メソッドもちょっと変更する)。
クロージャって、インスタンスやら何やらをパックして扱うものと理解してもいいのかなあ。
trait については、インタフェースとクラスの間にある"何か"、という理解をしたんだけど、グローバルスコープの関数だけでなく、プロパティを含めた"何か"にした感じかな。 ただ、インスタンスとして存在するものではないので、結局は定数とグローバル関数で済みそうな気もする。 理解が浅いような気もするけど。
いずれにせよ、5.4 は楽しみ。