ガンズターン 公式サイト

楽しいことに、まじめです。 ——ガンズターンアプリ研究所公式サイト

可変関数(PHP)を覚えた話

Pocket

ついに脳の老化が始まったかと震えた瞬間

前置き長いので、最初にもくじ置いときますね。

先日、「ドラゴンボール 復活のF」を鑑賞しに自転車で遠出をしたことについては、こちらの記事に書いた通りですが、わたしその時の帰りに本屋に立ち寄っていたのでした。  

とくに目的の買い物はなかったんですが、滅多に行かないショッピングモールで、思いも寄らず巨大書店に出会うことができたのでうれしくなってしまいまして。

気を緩めるとついつい本を買いすぎてしまいますので、この日はただ見るだけにして、一冊も買わずに帰るつもりでした。

けれど、何気なく視線をやった漫画の新刊コーナーに、一冊だけ、わたしの好きなギャグ漫画の単行本が置かれていたのです。

「日常」(※1)という漫画の、8巻でした。

(お、「日常」の新刊が出てる! ラッキー!

わたしは一冊も買わないと決意していたことなどすぐに忘れ、そのただ一冊の単行本を手に取りレジへと向かいました。

帰宅後、意気揚々と漫画本を取り出し、ワクワクしながら読み始めます。

漫画の内容自体は、いつも通りの「日常」であり、恥ずかしながら何度か声をあげて笑ってしまったほどにおもしろいものでした。

けれど、なんでしょう。
心なしか、いつもの「日常」の新刊に感じる目の覚めるようなギャグの鮮度が、わたしの手元にある「新刊」からはあまり感じられないように思えたのです。

(……はて? なぜだろうか? あれほど楽しみにしていた「日常」の新刊なのに、なぜか一つ一つのギャグから新鮮さを感じることができない……。ひょっとして、これが大人になるってことなのか……? ふむ。好きなものを心の底から楽しめなくなるとは、なんとも寂しいものだな……

そんな風に、ちょっとだけセンチメンタルな気持ちになりつつ、読了した「日常」8巻を本棚に収めようと立ち上がった、その時です。

「……え?」

あまりの衝撃に、わたしは立ちくらみを覚えました。

「……うそでしょ? どういうこと?」

わたしの脳内に、ポルナレフの「登っていたと思っていたら降りていた」AAが飛び交います。
ゴゴゴゴゴゴゴ——心なしか、そんなジョジョ風の効果音(※2)が、部屋中に響いていました。

「……あ、あるじゃん……8巻……。それどころか9巻も……(ゴゴゴゴゴゴ……)

……はい。
つまりわたし、1年以上前に買っていた8巻とまったく同じものを、再度新品で購入していたんですね。
そして、それどころか最後まで新刊だと信じ込んで読了してしまいました。

(そりゃ新鮮さなんて感じないはずだよ!
 だって一回読んでるんだもん!
 なにが「大人になるってことなのか」だよ!
 「大人になる」どころか「すでに老化がはじまってんじゃん!」)

そんなわけで、自分のあまりの天然っぷりに一人で絶望を感じつつ、本棚の前に立ちつくしてしまいました。(その顔は、あたかもちびまる子ちゃんのフジキくんのごとく青ざめていたことでしょう)

思えば、最初からおかしかったのです。
漫画の新刊のコーナーに、平積みにされるでもなく、ポップの一つがあるわけでもなく、ただ場違いなようにぽつん、と1冊だけ置かれている新刊があるはずないんですよ。

きっと誰かが、一度手に取ったものを適当な場所に戻していただけなのでしょう。

そんなことにも気付かずにときめきながら購入し、しかも読み終えるまで新刊だと信じて疑わないこの鈍さ……

昨日の記事で「体内年齢が実年齢+6歳」と書いて「やばい」と言っていましたが、どうやら「脳内年齢」はそれどころではないようです……

というわけで、季節柄(少し早いですが)、怖い話からブログを始めてみました。
ガンズターンのRyosukeです。

今日は、PHP「可変関数」なるものの使い方を覚えたのでそのお話をば。

1. 可変関数ってなにぞ?

世のプログラミング言語には「コールバック関数」なる便利な仕組みを携えたものが多くあります。
C言語であれば「関数ポインタ」、Objective-Cなら「ブロック構造体」(あるいはターゲット・アクションパラダイム)などなど……

いずれの場合も、プログラミングの基礎ができた上で、その応用的な感じで使い方を覚えていく、ていうのが一般的な学習の流れかと思いますが……
(関数ポインタも、ブロック構造体も、そもそもの記法が非常にとっつきづらく、プログラミング初心者が使いこなそうと思ってもハードルが高く感じられるものと思います。……というか自分は未だにとっつきづらいと感じてます)

2. PHPではめちゃくちゃ簡単だよ

ところがなんと、そんな難しい「コールバック関数」も、「PHP」においては、なんにも難しいことなしに実現できてしまうんです。

例えば、以下のように……

public function foo {
    $hoge = 'piyo';
    $this->bar($hoge);
}

public function bar(callable $func) {
    $this->$func();
}

public function piyo() {
    echo 'piyopiyo';
}

上記の例でいうとfunction「bar」の中の「$this->$func();」の部分が「可変関数」の記述をしている部分ですね。
最初にこの部分が呼び出される時、「$func」には「’piyo’」という文字列が代入されています。
そしてなんと、この変数名に、関数であることを示す「()」(←必要に応じてもちろん引数も入れられます)をくっつけてやるだけで、その変数に代入されてる文字列と同じ名前の関数が呼ばれちゃうんです。

つまり、これだけで「コールバック関数」の実現に必要な「動的な関数呼び出し」が実現されちゃってるわけですね。なんともすごい。さすがなんでもありのPHPです。

PHPを勉強し始めたころから、色んな点でちょくちょく驚かされてきましたが、この「可変関数」の記述の簡単さにはとりわけ度肝を抜かれました。

似たようなことをObjective-Cでやろうとしたら、きっとこの3倍以上のコード量が必要になるはず……

PHP、恐るべし……!!
(ここでは単純な「可変関数」だけをご紹介しましたが、なんと「call_user_func()」という仕組みを使えば任意のオブジェクトのメソッドを動的に呼び出すことも可能だとか。ほんと、恐ろしい子です。PHP)

3. んで、けっきょくそれ使って何ができるの?

「コールバック関数」ができるようになると、プログラミングの幅が大きく広がります。
何より、この仕組みを利用した他の人が作ったライブラリなども、仕組みを理解したうえで使えるようになります。

あと、コールバック関数的な使い方とはちょっと異なりますが、例えばオブジェクトの一部のプロパティの値に応じて挙動を変えたい時なんかに、いちいち「switch」文を使って条件分岐なんてやらなくてよくなります。

そんな時は、そのプロパティの値自体を文字列にして、その文字列をそのまま関数名にしてしまえば、プロパティの取りうる値の数だけ関数を作ることによって、簡単に挙動の動的な変更が可能になります。(もちろん、実装にはそれなりに工夫が必要ですが)

かく言うわたしも、開発中の新規アプリであるところの、パズルゲームの問題作成処理において、問題作成ロジックを可変関数として呼び出しています。

問題に関係するデータをおさめたデータベースの中に「問題作成ロジックの関数名」を記録したフィールドを設けておき、問題の作成時にそこを読み取って、動的に適切な作成方法を呼び出す、という仕組みです。

こうしておくことで、例えば今後、新しいパズル問題の作成方法を思いついた時にも、すぐに追加することなどができます。

可変関数を覚えると本当に便利で、すっかりPHPの虜になってしまいそうです。

4. というわけで「可変関数」のご紹介でした

本日の目標は「2時間以内にブログ記事を書き終える」でした。
なんと、もう残すところあと10分だけ……

本当はもうちょっと書き足したいところなんですが、読み返して整形し直したりする時間も考えなければならないので、本日はこのへんで。

前置きを書くのに一番時間がかかってしまったRyosukeでした。m(_ _)m


(以下の注釈は当ブログ管理人の個人的な見解ですのであしからず)

※1 「日常」とは……
「月間少年エース」に連載されている超絶おもしろギャグ漫画です。独特の、ちょっとゆるい、けど新しいギャグセンスに満ち溢れた作品で、わたしはこの作品の大ファンです。ちょっと前まで、テレビでアニメもやってましたね。読んだことない人はぜひ。でも、一つだけ約束をしてください。……ぜったいに電車の中で読まないことを。かくいうわたしは、一度通勤電車内で読んでいて「ぶほっ」と吹き出してしまったことがあります。スーツ姿のおっさんが、みっともないですね。それぐらいおもしろいです。(
本文に戻る)

※2 「ジョジョ風の効果音」とは……
「ジョジョの奇妙な冒険」を知らない人はわたしの中で日本人じゃないので、まさかそんな人がこのブログを読んでいるとは思いません。なのでその点はとくに説明しませんが、なんとこの時、ほんとうにわたしの部屋には「ゴゴゴゴゴ」という効果音が鳴り響いていたのです。果たしていったい、あの音はなんだったのか? 大地震の前触れか、はたまたポルターガイストか? ……謎はつきませんが、どうやら「稼働中だった洗濯機が暴れる音だった」、という説が濃厚のようです。……いやー、怖い話ですね……。(
本文に戻る) 

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

トラックバックURL: http://gunsturn.com/2015/05/09/php_variable_function/trackback/