CakePHP5入門【PHP言語の文法編④】関数
B美
A子
これまでの中にもちょこちょこ「関数」が出てきてたよね?
C菜
「print_r」や「file_get_contents」なんかを覚えてますよ~
B美
それはともかく、「関数」とは何か?
はい、C菜!
C菜
A子
Excelのsum関数やcountif関数をよく使うけど、そんな感じだと思う
B美
もっと細かいイメージとしては
『ブラックボックス化した箱の中に処理対象となるデータを投入すると、箱の中で何らかの処理が行われ、最終的には処理結果であるデータが出力される』
…って感じかな
Excelのsum関数って、入力するのは「合計したい数値が入っているセルの範囲」で、出力されるのは「その範囲にある数値の合計」よね?
C菜
函館の「函」は「箱」って意味ですよね~?
B美
「関数」がもともと「函数」と表記されてたってこと、よく知ってたわね
えらいえらい
A子
Excelの関数は基本的にそうだけど…
B美
入力の無い関数や出力の無い関数もあるわよ
C菜
<?php
phpinfo(); ?> |
これって入力値が何もないってことですよね~?
B美
あと、用語なんだけど
・入力値…「引数」
・出力値…「戻り値」または「返り値」
と呼びます
A子
B美
ただまぁ、そう感じる人は割と多いみたいで、一般的には「戻り値」のほうを使う人が多い気がする(苦笑)
C菜
「20と30という引数を入れると、130という戻り値が出力される」ってことですか~?
B美
「20と30という引数を渡すと、130という戻り値が得られる」
のほうが一般的かな
引数って「渡す」ものだからね
A子
あ、そういえばPHPの関数って、どのくらい用意されてるの?
前に出てきたやつだけじゃないわよね?
B美
A子
あ、「file_exists」や「file_get_contents」もあるね
B美
例えば、file_get_contentsをクリックすると…
C菜
B美
B美
file_get_contents関数の二つの引数については、$filenameと$use_include_pathを指定しただけね
(FILE_USE_INCLUDE_PATHという定数を使わないから、第2引数にはfalseを渡しています)
<?php
$test_file = 'test1.php'; if (file_exists($test_file)) { $info_file = file_get_contents($test_file, false); $result = htmlspecialchars($info_file, ENT_QUOTES); echo nl2br($result); } ?> |
戻り値はそのファイルの中身で、$info_fileという変数に代入されるってわけ
A子
B美
それじゃ、今回の学習内容として、新たな関数を作ってみましょうか
ホームディレクトリの下の「html」ディレクトリを開いて、「test4.php」を右クリックしてから「L3afpadで開く」を選択します
(もちろん「Plumaで開く」でも良いわよ)
B美
ちなみに、赤字で表示している部分が関数の定義よ
<?php
$test_file = 'test1.php'; $result = myfile_read($test_file); echo $result; function myfile_read($filename) { $result = ""; if (file_exists($filename)) { $info_file = file_get_contents($filename, false); $result = htmlspecialchars($info_file, ENT_QUOTES); $result = nl2br($result); } return $result; } ?> |
打ち込み終わったらファイル名を「test9.php」で保存して、ブラウザで確認してみてね
(URLは「localhost/test9.php」)
A子
B美
定義した関数はどこかで呼び出されない限り、勝手に実行されることは無いの
(「$result = myfile_read($test_file);」の部分が関数呼び出しよ)
つまり、このプログラムは「echo $result;」が実行されれば終了するってこと
↓
C菜
関数の定義は「function」から始まって、関数名を書いたらその後にカッコを書いて「引数」を記述して~
あとは波カッコの中に関数の中身を書けば良いんですかね~?
つまり
function 関数名(引数) {
関数の中身
}
…ってことでしょうかぁ~?
B美
まさにその通りよ
あ、複数の引数を渡したい場合は、カンマ区切りで複数個書いても良いからね
A子
(上の例だと「$result」)
だったら、さっきの関数ってさー
<?php
$test_file = 'test1.php'; $result = myfile_read($test_file); echo $result; function myfile_read($filename) { if (file_exists($filename)) { $info_file = file_get_contents($filename, false); $result = htmlspecialchars($info_file, ENT_QUOTES); return nl2br($result); } } ?> |
…って書いちゃダメなの?
B美
ただし、もしも存在しないファイルの名前を指定した場合、どうなると思う?
C菜
「$test_file = 'test1.php';」の中の「test1.php」を例えば「test1.txt」に変えてっと~
↓
C菜
B美
実はPHPの関数って、returnを実行せずに終了した場合、自動的に「null」が返ることになってるのよ
だからif文の中身が実行されていない(returnしていない)にもかかわらず、エラーが出なかったってわけ
(あ、でも他のプログラム言語ではエラーになりがちだから注意してね)
A子
B美
プログラム言語の一つである「C言語」とか「C++言語」では、また別の意味になるけどね
C菜
A子
あ、あと変数「$result」が関数の外(呼出し側)と内(関数側)にあるけど、同じものじゃないわよね?
B美
だからこそ戻り値を返しているわけだし…
そうねぇ
次のように書き換えてから「test10.php」というファイル名で保存してみて
<?php
$test_file = 'test1.php'; $result = ''; myfile_read($test_file, $result); echo $result; function myfile_read($filename, &$result) { if (file_exists($filename)) { $info_file = file_get_contents($filename, false); $result = htmlspecialchars($info_file, ENT_QUOTES); $result = nl2br($result); } } ?> |
C菜
B美
でも、関数側ではその値を受け取っていないのよ
A子
それじゃ、いったい何を「渡した」ってのよ
B美
具体的には「$result」という変数の「場所情報」ってこと
C菜
B美
さすがはC菜ね
で、どうすれば「参照」を渡せるかっていうと、関数側の定義において引数の前に「&」を付ければ良いだけなのよ
(呼出し側じゃなくて、関数側だからね)
ちなみに、用語だけど
・関数には「値」を渡す → 値渡し(Call by Value)
・関数には「参照」を渡す → 参照渡し(Call by Reference)
と呼びます
A子
最初からこっちを説明しなさいよね
B美
基本的に「参照渡し」は使用しないように!
A子
何でよ?
C菜
B美
モジュール間結合度が強くなると、モジュールの独立性は低下するからね
A子
B美
「参照渡し」については、知識として持っておくだけでOK
A子
要するに、「値渡し」では渡された値をどういじくろうが、呼出し元のほうには影響を与えない…ってことよね?
あ、そうか!
「参照渡し」だと、呼出し元と関数側が相互に影響しあっちゃうんだ!
それが「独立性の低下」って意味じゃない?
B美
A子もなかなかやるじゃない
ちょっと見直したわ
A子