パーフェクトPHPのクロージャの説明が全然わからなかった

というありがたい環境の中で現在もっぱらパーフェクトPHPの書籍にて勉強させていただいてます。そのパーフェクトPHPの中でクロージャの説明がよくわからなかったです。

クロージャとは、関数内に現れる変数の名前解決が、ローカルスコープだけでなく関数が定義された場所のスコープも含めて行われる関数のことです。

???

よくわからなかったので調べてみても、「無名関数はクロージャとも呼ばれる」みたいなことが書いてあって、なんかちょっと違うような気がしました。そんな中で下のエントリがとてもわかりやすかったです。

sekai.hatenablog.jp

要するに無名関数の中では無名関数の外の変数は見えないのでuse()で見えるようにしましょうということでしょうか。

<?php
function method() {
    $hello = 'hello';
    $closure = function() {
        echo "${hello}! world!", PHP_EOL;  // Notice:  Undefined variable: hello…
    };
    $closure();
}
method();

としても5行目の無名関数の中で$helloが見えないので実行時エラーNotice: Undefined variable: hello…になります。  
 
 
そのため下のように引数で渡すようにもできます。

<?php
function method() {
    $hello = 'hello';
    $closure = function($greeting) {
        echo "${greeting}! world!", PHP_EOL;
    };
    $closure($hello);  // => hello! world!
}
method();

 
 
ただこれだと無名関数に渡したいものが増えた時に引数を増やしたりでメソッドの仕様が変わってしまうので、その時にuse()を使えば便利ですよってことです。

<?php
function method() {
    $hello = 'hello';
    $closure = function() use ($hello){
        echo "${hello}! world!",  PHP_EOL;
    };
    $closure();  // => hello! world!
}
method();

 
 
この場合のuse()で渡す$helloは値渡しなので無名関数内で書き換えても外側の$helloは書き換えられません。

<?php
function method() {
    $hello = 'hello';
    $closure = function() use ($hello){
        $hello = 'goodby';
        echo "${hello}! world!",  PHP_EOL;
    };
    $closure();  // => goodby! world!
    echo $hello; // => hello
}
method();

 
 
無名関数の中で書き換えたい場合はuse()で参照渡しができます。

<?php
function method() {
    $hello = 'hello';
    $closure = function() use (&$hello){  //参照渡し
        $hello = 'goodby';
        echo "${hello}! world!",  PHP_EOL;
    };
    $closure();  // => goodby! world!
    echo $hello; // => goodby
}
method();

 
 
ということでOKかな!

ちなみにですがクロージャの概念を知るにはこれがわかりやすかったです!まさにuse()でローカルスコープ外の変数を捉えるということですね。

qiita.com

その上でパーフェクトPHPで書いてる内容をみたら言ってることの意味がわかった。。要するにクロージャの概念が全くわかってなかったということでした。ちゃんちゃん。

ブログのPVがあがってテンションがあがっています

ブログのアクセスがあがると嬉しいです。 これまで1日5PVとかしかなかったのにいきなり1600PVとかになりました。

f:id:kimromi:20150702223311p:plain

そうしたら1年前弱くらいのエントリがまたアクセスが上がったりして、なんだかすごいなぁと思います。

もっとすごいブロガーさんやエンジニアさんからしたら屁みたいな数字でしょうけど、こんなエントリでも許してください。

1つだけ工夫していたこと

1つだけ工夫というか、こうしててよかったと思うことがあります。それは、ブログ名にTwitterのIDを入れていたことです。このブログの名前は「ブログ @kimromi」です。

なぜそうしたかというと、下のエントリを見たから。

www.ikedahayato.com

ブログの名前を決めるときどうしようか悩んでいたのですが、考えてみると他人のブログ名って自分自身あんまり関心がなくて、じゃあ何でもいいかと思っていました。それだったらもしアクセスが上がることがあったらどうなるかと思ってTwitterのIDをいれました。

ブログのエントリをTwitterにシェアされるたび下のような感じでツイートされるので、自分にメンションが飛んできます。

結構な数のメンションが飛んできたのでその度おぉ〜と驚いていました。iPhoneの通知はよく来るし、Macのデスクトップにも通知されるようにしてたので、またシェアされた!と思っていました。結果、確実にブログに対するモチベーションは上がっています。

Twitterの通知がなかったら自分で自分のエントリを見てはてブ数、その他シェアの数を確認しないとわからないのでいまいち実感はわかなかったのではないかと思ってます。

しかしまぁめちゃくちゃバズった!!ってわけではないし、シェアされることが目的ではないので、これくらいの感じが続いたらモチベーション的にはいいなと思いつつ、ちょこちょこエントリを書いていきます。アウトプットアウトプット。

ITエンジニアは仕事で感動を味わいにくい

1つ前の「GMOペパボに入社しました」のエントリが予想以上にアクセスされていてびっくりしてます。

kimromi.hatenablog.jp

それはそれとして今日感じたことを書こうと思うのですが、録画したNHKの「プロフェッショナル仕事の流儀」をみていて、お菓子業界のヒットメーカーが、新卒社員向けにこんなことを話していたのが印象に残りました。

バレーボールで誰かがスパイクを決めたりするとすぐ輪になってハイタッチしますよね、 あの感覚は絶対職場の中で持っていてほしい。

今まで開発してきた中でその感覚は正直感じたことはありません。新規サービスの開発でもリリースできたら、なんとかリリース間に合ってよかった・・・大丈夫かな・・で、その後は不具合対応や機能追加など、比較的地味な作業がずっと続いて、ものすごく喜んだり感動したりするのことはなかったように思います。リリースなんとか間に合ってよかったねとチームのみんなで胸をなでおろしながらお酒を飲んだことを思い出します。

サービス開発には終わりがない

サービス開発には終わりがありません。終わるときはサービスが終了するときで、悲しいです。そこが一番の要因かなと思います。

例えば建築家なら建物が完成した時にその建物が完成したら1つの自分のポートフォリオとなり、次の建物のデザインをします。SIROBAKOで舞台になっているアニメ制作会社では1つのアニメをみんなで作り上げてテレビ局に納品できればやったー!と喜び、次のアニメ制作へと移ります。でもITエンジニアはサービスをリリースしてからも同じサービスを長く保守しなければなりません。

同じなのでは?

自分で書いていて感じたのですが、ITエンジニアも、建築家も、アニメ制作だって、どの職業も仕事には終わりはありません。ただ区切りがあるかどうかの違いだけです。ITエンジニアも区切りを喜び感動できれば、もっと魅力的な業種になると思います。具体的にどうすればいいかは全く思い浮かんでいないので申し訳ないのですが、優秀なエンジニアが集まる会社にはなにかそういった部分があるような気がしています。

「苦労してないから感動もないのだ」とか言われそうですが、経験的には苦労してもその先には安堵しかなくて感動とは何か程遠いものがあります。どうすればみんなで喜ぶことができるか考えながら、何か見つければ仕事に取り入れていきたいと思います。