質問: ファンクション(関数)の使い方について質問させてください。 ``` //サンプルA 生年月日 1950 年 ``` 1950年から現西暦までのドロップダウンリストを動的に作るには下記のようになります。 ``` //サンプルB 年 ``` 例えば、サンプルBのプログラムをfanction yearのように関数化しておいて、 サンプルAでyear()のように呼び出して1950年から現西暦までのドロップダウンリストを生成したいのです。 ``` //サンプルA 生年月日 ここにファンクション記述 ``` 下記の様に記述すれば実現できます。 ``` //サンプルA 生年月日 年 ``` しかし、サンプルAのプログラム量を減らしたいのです。 サンプルAとサンプルBにはどう記述すればいいでしょうか?
回答: 実はHTMLと組み合わせる部分の関数化は中々にめんどくさい問題です。 どこかでロジックと表示が混ざってしまい、表示を変更したいだけなのにロジックを変更しなければならないというジレンマに陥るからです。 例えば、 ``` //サンプルB function getYearOptions(){ $now = date("Y"); for($i = 1950;$i <= $now;$i++){ $options .= "".$i.""; } return $options; } //サンプルA 生年月日 年 ``` の様にして、関数内でHTMLを組み立ててしまえばサンプルA側では呼び出して戻り値をechoすればOKです。 も関数内で組み立ててしまってもいいでしょう。 ただ、この関数はselectBoxのoptionとしてしか使えないので、他の選択肢、例えばチェックボックスを作るという用途としては使えません。 逆に ``` //サンプルB function getYearOptions(){ $now = date("Y"); for($i = 1950;$i <= $now;$i++){ $options[] = $i; } return $options; } //サンプルA 生年月日 ".$val.""; } ?> 年 ``` の様にすると、関数内ではあくまでデータを作るだけで、HTML側でそれをどう組み合わせるかはその都度組み立てればいいので、汎用性は高まりますが、今回の件だとサンプルA側は大してコードは減りません。 どちらが正しいという訳では無いので、そのアプリケーション毎にポリシーを決めて、どういった方法が向いているか考えて実装してみて下さい。