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

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

詳細はこちら
PHP

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

Q&A

解決済

4回答

878閲覧

phpの関数の引数で見た事のない形

ryu0311

総合スコア32

PHP

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

0グッド

0クリップ

投稿2019/10/03 01:08

編集2019/10/03 01:19

phpについて
php初心者です。

以下のような関数で、引数に(array &$array, $quiz)となっているのがわかりません。
ふつうは、function func($array, $quiz)ではないですか?

function array2csv(array &$array, $quiz) { if (count($array) == 0) { return null; } ob_start(); $df = fopen("php://output", 'w'); $arr_keys = ['Surname', 'First name', 'Email address', 'State', 'Started on', 'Completed', 'Time Taken', 'Grade/10.00']; // csvに$arr_keysを書き込む fputcsv($df, $arr_keys); // $arrayはどこから? foreach ($array as $row) { $outrow['Surname'] = $row->lastname; $outrow['First name'] = $row->firstname; $outrow['Email address'] = $row->email; $outrow['State'] = $row->state; $outrow['Started on'] = date('Y/m/d G:i', $row->timestart); $outrow['Completed'] = date('Y/m/d G:i', $row->timefinish); $outrow['Time Taken'] = $row->duration; $outrow['Grade'] = quiz_rescale_grade($row->sumgrades, $quiz); if($outrow['Grade'] == "未評定") { $outrow['Grade'] = ""; } fputcsv($df, $outrow); } fclose($df); return ob_get_clean(); }

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

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

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

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

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

m.ts10806

2019/10/03 01:25

「ふつう」というのが何と比較しているのか分かりません。 構文上問題ないのでこれはこれで「ふつう」です。
ryu0311

2019/10/03 01:26

引数の中の、array &に何らかの意味があるなら、それを知りたいと思いまして...
m.ts10806

2019/10/03 01:26

あと、処理には流れがあるのでこれだけ提示されても応えようがありません。この関数がどのように使われるのか、流れがわかるようなコード全体をご提示ください また「初心者」自体は要件ではありませんので、質問内に書くのではなく「初心者アイコン」をつけるにとどめてもらえたらと。
m.ts10806

2019/10/03 01:28

>array &に何らかの意味があるなら、それを知りたいと思いまして... 赤の他人ですので書かれていないことを汲み取ることはできません。 質問内にきちんと記述願います
guest

回答4

0

もう一個の方を回答しますw

型宣言

投稿2019/10/03 01:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2019/10/03 01:41 編集

役割、意味的には参照渡しより大事ですね。
guest

0

ベストアンサー

以下のような関数で、引数に(array &$array, $quiz)となっているのがわかりません。

よくある関数の引数だと、おっしゃるとおり
($array, $quiz)
だと思います。

  • 頭に array と書かれている理由

引数の型宣言(PHP5系だとタイプヒンディング。配列の場合はPHP5.1~)です。
この$arrayという変数には、必ずarray型の値を渡してください(それ以外はエラー)となります。
※型宣言という機能はPHP7.0からできた新しい機能です。

  • 変数の頭に & が付いている理由

引数の参照渡しです。
& が書かれていない場合は、引数は基本的に値渡しになっています(ただし、オブジェクトはデフォルトでも参照渡しですのでご注意ください)。
→オブジェクトの場合のデフォルトは「オブジェクトIDの値渡し」だそうです。
本回答のte2jiさんのコメントに、参考になるリンクがありますので、詳細はそちらをご覧ください。

オブジェクトの場合の挙動はちょっとややこしいので、それ以外について……という但し書き付きになりますが、値渡しと参照渡しの違いは、その関数内で変数の中身を変更した時に、呼出し元の変数の値が変わるかどうか、です。

php

1function setHoge($a) { 2 $a = 'hoge'; 3} 4 5function setFuga(&$a) { 6 $a = 'fuga'; 7} 8 9$str = 'Hello World'; 10echo $str; // Hello World 11echo "\n"; 12 13setHoge($str); 14echo $str; // Hello World(値渡しされた引数の中身が変更された=呼出し元の変数には影響なし) 15echo "\n"; 16 17setFuga($str); 18echo $str; // fuga(参照渡しされた引数の中身が変更された=呼出し元の変数の値も変わる) 19echo "\n";

というわけで、まとめると array &$array は「array型の値しか渡せなくて、関数内で値を書き換えると呼出し元の変数の値も変わる」ということになります。

いずれも、PHPマニュアルの「関数の引数」ページに記載されておりますので、詳細はそちらをご覧ください(それぞれ「引数の参照渡し」「型宣言」という項に書かれています)
https://www.php.net/manual/ja/functions.arguments.php

投稿2019/10/03 01:41

編集2019/10/03 05:06
nak

総合スコア696

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

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

退会済みユーザー

退会済みユーザー

2019/10/03 02:09 編集

> この機能はPHP7.0からできた新しい機能です。 array は PHP 5.1.0 以降かと > & が書かれていない場合は、引数は値渡しになっています。 ちがいます。詳しくは以下を確認すると良いです。 https://qiita.com/mpyw/items/bd38da57837d35214aae
退会済みユーザー

退会済みユーザー

2019/10/03 02:10

いや、合ってるのか?
退会済みユーザー

退会済みユーザー

2019/10/03 02:15

> 値渡しと参照渡しの違いは、その関数内で変数の中身を変更した時に、呼出し元の変数の値が変わるかどうか、です。 こっちが違うのか。 オブジェクトを渡したときの挙動が上記では説明できません。
nak

2019/10/03 04:47 編集

>te2jiさん ご指摘ありがとうございます。 > array は PHP 5.1.0 以降かと 型宣言はPHP7からの機能なので、「PHP7からの~」という説明は「型宣言」という言葉にかかっています。 # PHP7系は「型宣言」、PHP5系は「タイプヒンディング」という別概念になっているので。できることはほぼ一緒ですが、エラーが違ったり、微妙な相違点が……。 なお、ご指摘いただいた「array」のタイプヒンディングについては「PHP5.4以降でも似たようなことが……」のところでフォローしたつもりでした(配列のみ5.1からサポート、というのは認識していなかったので、バージョン番号はずれていますが……そちらは修正しておきます)。 > オブジェクトを渡したときの挙動が上記では説明できません。 すみません、オブジェクトのみデフォルトで参照渡しになっているのを失念しておりました……。 回答修正しておきます。
退会済みユーザー

退会済みユーザー

2019/10/03 03:52

通常の引数としてのオブジェクトは、「オブジェクトIDの値渡し」です。(ややこしいw) 挙動としては参照渡しに近い気がしますが、オブジェクトの参照渡しは別の挙動をします。 私もいつもわからなくなるので、「参照渡し」という言葉の使用そのものを避けるのですが、 https://qiita.com/tDash/items/88e0e11a0247151f32c9 のコメント欄がわかりやすいです。
nak

2019/10/03 05:01

わかりやすいページのご紹介ありがとうございます! オブジェクトIDの値渡しと参照渡し、ほぼ同じものだと思っておりました(参照渡し=「アドレスをコピーして同じ実体を参照するもの」だとばかり……)。お恥ずかしい限りです。 ひとさまに説明させていただく時は、きちんと裏を取ってからにしないといけませんね。
guest

0

質問のような構文に関する疑問は、マニュアルを見れば記載されています。
PHP - マニュアル - 言語リファレンス - 関数 - 関数の引数 - 引数の参照渡し

投稿2019/10/03 01:33

Y.H.

総合スコア7918

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

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

0

リファレンス渡し、または参照渡し
です。

PHPマニュアルにも解説はありますが、色々コードを書いて動かして情報の変化をデバッグで見ていったほうが理解に繋がります。

投稿2019/10/03 01:29

m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問