🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

5回答

197閲覧

PHP 関数化について

daiki1

総合スコア9

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2019/10/18 04:28

現在PHPの学習をテキストブックを使って学んでいます。
何周かテキストブックをして次に関数化する練習としてテキストブック
の内容を関数化しようと試みるのですがやり方がわかりません。

関数化する目的などは人によって違う事はわかりますが、例として下記の
サンプルスクリプトを関数化する場合どうするか教えて頂きたいです。
私が考えれる関数化
①$questionの配列を関数化する
②form/inputを関数化する
また、関数化した内容を使って他のコードを書いて頂けたらとても助かります。

<?php require '../header.php'; ?> <p>秘密の質問を選択してください。</p> <form action="select-foreach-output.php" method="post"> <select name="question"> <?php $question=[ '最初に見た映画の名前は?', '最初に飼ったペットの名前は?', '初めて買った車の名前は?', '卒業した小学校の名前は?', '小学校の担任の先生の名前は?', '生まれた市町村の名前は?' ]; foreach ($question as $item) { echo '<option value="', $item, '">', $item, '</option>'; } ?> </select> <p>質問の回答</p> <p><input type="text" name="answer"></p> <p><input type="submit" value="確定"></p> </form> <?php require '../footer.php'; ?>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/10/18 04:49

質問は編集できます。 コードはマークダウンを利用してください
m.ts10806

2019/10/18 04:57

あとまず「考えられる関数化」を実現したコードを書いて提示してください。作業依頼になってます
guest

回答5

0

①$questionの配列を関数化する

配列は関数化するのに適当ではありません。

投稿2019/10/18 04:30

maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daiki1

2019/10/18 06:12

ご回答有り難うございます。
guest

0

テキストを何回か読んでるということは、関数の構文自体は分かっていて、
「そもそも どこを関数に切り出したら良いのか分からない」 という話ですよね。

この短いコードでそんなことをするか? というのは置いておくと、

  • 処理に名前をつける

というのは わかりやすい指標だと思います。
コメントをつける単位で、その内容を関数にするとか。

例えば、

php

1// output option tag 2foreach (...) { 3 echo('<option>'...); 4}

この部分を、こうするとか。

php

1outputOptionTag($questions);

投稿2019/10/19 03:12

tanishi_a

総合スコア484

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

現在PHPの学習をテキストブックを使って学んでいます。

何周かテキストブックをして次に関数化する練習としてテキストブック
の内容を関数化しようと試みるのですがやり方がわかりません。

やり方がわかりません、ここをもう少し掘り下げましょうね。

関数化することのメリット、デメリットを検討して、
本当に関数化する必要があるのかどうか、
改変する作業コスト、実装難度も考慮してくださいね。

やり方がわかりません、やり方が本当にわからないんですか?

php

1function get_question() { 2 return [ 3 '最初に見た映画の名前は?', 4 '最初に飼ったペットの名前は?', 5 '初めて買った車の名前は?', 6 '卒業した小学校の名前は?', 7 '小学校の担任の先生の名前は?', 8 '生まれた市町村の名前は?' 9 ]; 10}

これも単に配列を返すだけのユーザー定義関数です。
これだけではなんのメリットも感じられないでしょうが、
例えばここにデータベースへのアクセスを組み合わせて、
(固定の質問文ではなく)データベース上に格納した質問文データを返すこともできそうです。
もしくは、質問文をまとめたテキストファイルがあって、そこから読み込んでもいいし。

関数の呼び元では

php

1$question = get_question();

するだけで、質問文データがどこからやってきたのかを意識しなくてもいいわけです。

投稿2019/10/18 05:23

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daiki1

2019/10/18 06:12

ご丁寧に有り難うございます。
guest

0

これと決まったやり方はありません。

考え方としては「役割分担」としたほうが良いコードになります。
「役割分担」が考え方として難しければ「部品化」でもいいです。

「同じもの」を作るけど「ちょっと違う」ところを引数で分岐などをかけて対応します。
例えば、色だけが違う、中身だけが違う、on/offを切り替えるだけ、など。

入力フォームの各入力コントロールなんていい部品化の素材です。

nameの設定値が変わる
valueの設定値が変わる
classの設定値が変わる

など、それだけで結局作るのはinput type=text です。

selectタグの場合もnameとoptionの中身とデフォルト値(selected)だけが変わるだけで、そこを引数で対応すればひとつ関数作るだけで違うselectが作れますよね?

と言った具合に、「役割分担」「部品化」の観点から関数を切り出してみてください。

投稿2019/10/18 04:49

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/10/18 04:53

ちなみに同じような質問は過去にも出ていますし、私も答えたことがあります。
daiki1

2019/10/18 06:11

何度もすみません。 有り難うございました。
m.ts10806

2019/10/19 02:27

追記修正依頼は見られているのでしょうか。 質問も回答もコメントも編集可能です。コードがマークダウン利用されてないと読む気が失せる回答者は多いです。正しく再現確認もできません。 また「すみません」「ありがとう」だけでは質問者の現状や理解度は全く伝わりませんので、具体的にコメントしてください。 回答者は誰も急いでいないので「とりあえずのお礼」は欲してないことがほとんどです。 欲しいのは質問者の理解と問題解決のプロセスです。
guest

0

①も②も関数化という観点から外れています。
ひとまず今のコードを関数化するとスッキリするかもという観点から書いてみました。
このサンプルではSelectタグを出力する関数MakeSelectと、Selectタグを返却する関数MakeSelect2を作ってみました。
どちらの関数も引数にアイテムの変数を指定するようにしています。
MakeSelectは関数内でHTMLを出力するのに対し、MakeSelect2は呼び出し元で出力するようにしています。
今回の場合、個人的には2の方が用途として適していると思います。

PHP

1<?php 2$question=[ 3 '最初に見た映画の名前は?', 4 '最初に飼ったペットの名前は?', 5 '初めて買った車の名前は?', 6 '卒業した小学校の名前は?', 7 '小学校の担任の先生の名前は?', 8 '生まれた市町村の名前は?' 9]; 10 11$address=[ 12 '東京都', 13 '埼玉県', 14 '千葉県', 15 '神奈川県', 16]; 17 18function MakeSelect($items) 19{ 20 $html[] = '<select name="question">'; 21 foreach ($items as $item) { 22 $html[] = '<option value="' . $item . '">' . $item . '</option>'; 23 } 24 $html[] = '</select>'; 25 echo join($html, PHP_EOL) . PHP_EOL; 26} 27function MakeSelect2($items) 28{ 29 $html[] = '<select name="question">'; 30 foreach ($items as $item) { 31 $html[] = '<option value="' . $item . '">' . $item . '</option>'; 32 } 33 $html[] = '</select>'; 34 return join($html, PHP_EOL) . PHP_EOL; 35} 36?> 37<?php require '../header.php'; ?> 38<p>秘密の質問を選択してください。</p> 39<form action="select-foreach-output.php" method="post"> 40<?php MakeSelect($question) ?> 41<?=MakeSelect2($address) ?> 42<p>質問の回答</p> 43<p><input type="text" name="answer"></p> 44<p><input type="submit" value="確定"></p> 45</form> 46<?php require '../footer.php'; ?>

投稿2019/10/18 05:15

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問