質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

1172閲覧

PHP/ユーザー定義関数/可変関数/高階関数/コールバック関数について

hiro0208

総合スコア75

PHP

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

コールバック

コールバックは他のコードに引数として渡されるコードのことを指します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2021/06/26 02:30

編集2021/06/26 02:40

ユーザー定義関数を学習していますが、可変関数、高階関数仕組みについてよくわからなかったので相談します。

下記内容について3点わからない点があったため、そちらについてご教授を頂ければと思います。

1.このsetFruits関数の作成目的やメリットはなんでしょうか?

高階関数ということで、別のデータや処理を引数にセットし利用できるという汎用性をもたせることが目的でしょうか?

function setFruits(array $array, callable $func){ foreach($array as $key => $value){ $func($value, $key); } } function showItem($value, $key){ echo $key . ':' . $value . '<br>'; } $data = ['りんご', 'バナナ', '桃']; setFruits($data, 'showItem');

【出力結果A】

0:桃 1:りんご 2:バナナ

2.記述の仕方について

別の方の記述で

$data = ['りんご', 'バナナ', '桃']; function showItem($value, $key){ echo $key . ':' . $value . '<br>'; } function setFruits(array $array, callable $func){ foreach($array as $key => $value){ $func($value, $key); } } setFruits($data, 'showItem');

とあり、こちらの方が、処理の手順がわかりやすかったです。
わかりやすかった理由として
->データ用意
->関数作成
->関数作成
->関数実行
という取り扱うデータから扱うプロセスだったからです。

この手順も同じ結果になります。この記述の仕方でも学習やシステム開発で使用する上でありでしょうか?


3.「$func」について

この$funcは、一体なんでしょうか?
高階関数の親関数setFruits($data, $func)には、仮引数として存在し
戻り値$func($value, $key);では、「$変数名」で呼び出せる関数のように可変関数で扱われています。

参考書にはユーザー定義関数$funcと紹介されていますが、定義されている記述がないため、?となりました。
なぜユーザー定義関数と言えるのでしょうか?

ユーザー定義関数というのは、

function 関数名(仮引数){ 処理 }

のようにfunctionで定義された、関数名のことではないんでしょうか?

可変関数は、ユーザー定義関数の一部だからということでしょうか?

https://www.php.net/manual/ja/functions.user-defined.php
>上記サイトより、「PHP では、関数は参照される前に定義されている必要はありません。」
だから$funcもユーザー定義関数と言えるのでしょうか?

ご教授いただければと思います。

*今回バナナはフルーツととらえています、ご了承ください。

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

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

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

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

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

m.ts10806

2021/06/26 02:40

型 については分かりますか?
guest

回答1

0

ベストアンサー

1.このsetFruits関数の作成目的やメリットはなんでしょうか?

再利用可能にする為だったり、可読性上げる為だったりです
一度しか実行しない処理なら関数にしなくても構いません
ただ質問文のコードに関してはは引数に関数名を渡せる事を見せたくてやっているだけだと思いますが

2.記述の仕方について
この手順も同じ結果になります。この記述の仕方でも学習やシステム開発で使用する上でありでしょうか?

関数の宣言(定義)をして使うだけなら問題ありません
しかし変数に関数を代入して使う場合は質問文のひとつめのコードのような順序で用意する必要があります
例えば

php

1<?php 2$userfunc_showItem = function ($value, $key){ 3 echo $key . ':' . $value . '<br>'; 4}; 5$userfunc_showItem("ばるー", "けい");

これは$v=123; echo $v;の順序が逆だと正しい動作をしない事と同じ理由で、使う前に代入する必要があります

3.「$func」について

php

1$funcName = "myFunc"; 2function myFunc(){ 3 echo "myFuncを呼び出した\n"; 4} 5 6$funcName(); 7myFunc();//と書くのと同じ

呼び出す関数名を変数で渡しているだけです
質問のコードだと、$funcには呼び出す変数名showItemが入ってますね

投稿2021/06/26 02:59

hentaiman

総合スコア6415

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

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

hiro0208

2021/06/27 02:56

回答ありがとうございます。 記述については、変数や関数の動きをシンプルに単純に考えて考えてみるのが いいんだなと感じました。ありがとうございました。 ユーザー定義関数とい言われている点が気になったんですが、変数に文字列が入り、入ったことで関数として機能するから、可変関数、つまりユーザー定義関数になるっていうことですかね。。。
hentaiman

2021/06/27 03:44

phpマニュアルも自分で探し当てたんですよね?コードと同じように単純に文字通り受け取ればいいんですよ 「ユーザー定義関数」という説明で「function~~{}」のような関数定義の仕方の説明があるのでそれの事だと思えば良いです 一応言うと、以下のURLの標準関数(ビルトイン関数)と区別する為にユーザー定義関数と書いているだけだとは思います https://www.php.net/manual/ja/language.functions.php
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問