気になる用語
PHP再学習のため公式ドキュメントを眺めていたところ、「可変関数」というキーワドを発見した!
このブログを読んでいる人は気付かれているだろう。「無名関数」、「三項演算子」、「再帰処理」とIT用語では珍し漢字、適度な長さの単語、これに執着して記事いをいくつか書いている。「可変関数」は見逃せないのだ。
可変関数とは
PHPの公式ドキュメントはとってもわかりやすいので、そのまま抜粋。
『PHP は可変関数(variable functions)の概念をサポートします。 これにより、変数名の後に括弧が付いている場合、その値が何であろうと PHPは、関数を探し実行を試みます。 この機能は、コールバック、関数テーブル等を実装するために使用可能です。』
少し難解だが、よくよく読むと凄いことが書いている。プログラムで確認する。
1 2 3 4 5 6 7 8 9 10 |
<?php function disp(){ echo "呼ばれたよ"; } $x = "disp"; $x(); ?> |
xに文字列dispを保存した。8行目で変数名の後ろに()を付ける。公式ドキュメントではこれで変数内の値が何であれ、同じ関数名を探し、実行するというのだ。やっぱり怪しいなぁー。実行!
<実行結果>
関数が実行された!、さすが公式ドキュメント!嘘は書いていない!。
これ、もしxに存在しない関数名を保存したらどうなるのだろうか
<実行結果>
やはり、関数名が存在しないエラーになった。
文字列を基に関数を呼出すって、うまく説明できないが言語仕様的に無理やり感というか大胆というか、違和感がある。登場が2000年ぐらい。オブジェクト指向が完全サポートされていない時期なので、それを補うためだったのか?
使いどころは?
機能はわかったが何が便利なのか?それは先程の公式ドキュメントに書いてあった
『・・・・。この機能は、コールバック、関数テーブル等を実装するために使用可能です。』
なるほど、関数テーブルで考えてみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function first(){ echo "1塁"; } function second(){ echo "2塁"; } function third(){ echo "3塁"; } $table = ["first","second","third"]; $key = 1;//1~3と変動すると家庭 $table[$key-1](); |
11行目で関数名に対応する文字列を配列にしている。13行目の数値が変動すると仮定する。15行目が可変関数での関数呼び出しだ。
<実行結果>
外部から入力される動的な値(例では$key)によって、関数を呼出したい時に、可変関数を利用すれば、長々とif文を書かなくてもよいのだ。
いやー可変関数便利、便利。なんか「可変関数」とう名前も納得だ。
「いや、いや、プロとして今まで知らなかったことが問題では?」
・・・おっしゃる通りです。PHPだと事務処理系のプログラミングが多くて、あまり困ったことがなかったのです(いいわけ・・)。フレームワークなどでは多用しているかもしれませんね。反省してます・・・。
もう少し調べる必要がある
PHPの可変関数は理解できた。でも気になることが増えてしまった。他のプログラミング言語ではどうなのか?JavaScriptはもっと高度な機能があった気がするしPythonはできるのか?そもそもオブジェクト指向型なら可変変数なんて不要かも?
ここまでのまとめ
たくさんの宿題を残したままだが、ここまでのまとめをする。
- PHPの可変変数は便利だ
- 他のプログラム言語にはあるの?
- オブジェクト指向型で書けばいいのでは?
- PHPもPyWeb見たいにお気軽実行したい。
つづくかも