「PHP/入門/関数とは」の版間の差分
293 行 | 293 行 | ||
// 出力 |
// 出力 |
||
print($atai(2)); // 14 なぜなら 2×7=14 なので |
print($atai(2)); // 14 なぜなら 2×7=14 なので |
||
print("\n"); // 改行 |
|||
print($atai(5)); // 35 なぜなら 5×7=35 なので |
|||
?> |
?> |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
299 行 | 301 行 | ||
<pre> |
<pre> |
||
14 |
14 |
||
35 |
|||
</pre> |
</pre> |
||
となります。 |
となります。 |
||
アロー関数の定義の命令自体は1個の命令だけで構成される必要がありますが、アロー関数自体は1回以上でも何度でも呼び出せて使えます。 |
|||
===== 数値計算以外 ===== |
===== 数値計算以外 ===== |
2021年10月31日 (日) 08:15時点における版
基本
PHPにおけるユーザー定義関数
PHPにかぎらずプログラミング言語全般において一般に「関数」(かんすう)とは、行いたい処理をひとまとめにして、あとでそれを簡単に実行できるようにするためのものである。
PHPには、あらかじめ、よく使われる関数がいくつか用意されており組み込まれているが、それとは別に、ユーザーが独自の関数を定義することもできる。
本ページでは以降、特にことわらないかぎり、「関数」と言った場合は、ユーザー定義関数のことであるとする。
- ユーザー定義関数の例
<?php
f();
function f(){
print "a<br>";
print "b<br>";
}
?>
ユーザー定義関数は、上記のように使われる。
上記コードを実行すると、
a b
のように表示される。
- 関数の使用法
関数をユーザーが定義するには、function 宣言を使い、波カッコ { } の中に処理をかく。
つまり
function 関数名(引数) {
// させたい処理をカッコ内に書く
}
という書式である。(※ 余談だが、JavaScript でも関数の定義には function 宣言が必要になる。)
PHPで関数を実行させたい場合には、phpタグ内で関数の名前(上記コードでは「f」が名前)を書くだけで、{ }カッコ内の処理を行ってくれる。
「引数」(ひきすう)とは、関数が呼び出されたときに、呼び出し元から受け取る情報のことです。
(ちなみに、PHPはコードをすべてメモリに読み込んでから実行するため、関数をプログラムのどこに書いても 関数を使うことができる。)
値を返す関数
関数は、呼び出し元に確定したデータを出力することもできる。なお、確定したデータのことをプログラミング用語で一般に「値」(ち、あたい)という。データが確定さえしていれば、数値でなくても文字列であっても、プログラミングでいう「値」である。
関数が呼び出し元に確定データを与える事を、関数が「値を返す」という。
値を返すには return
という宣言を使う。returnはその後に書かれた確定値 (整数、浮動小数、文字列) を返す。
例えば、下記のコードは、単純に関数fが1を返す関数である。
<?php
$a = f();
print $a;
function f(){
return 1;
}
?>
実行結果
1
と表示される。
- 解説
上記コードを実行すると、まずf()が呼び出され、f()から1が返され、その値が $a = f();
という代入命令により $a には 1が代入される。
なお、プログラミングでは代入命令の式は一般に、右辺から先に実行される。
- 参考
<?php
$num = pi();
print $num;
?>
を実行すると、
3.1415926535898
のように表示される。
pi()
は、円周率の数値を返す関数である。
引数をもつ関数
関数には引数(ひきすう)を持たせることもできる。引数とは、関数の呼び出し時に値を渡して処理させるために、渡す値のこと。引数は複数個でも単数個でも0個でも構わない。PHPに限らず一般にプログラミング言語は関数に引数を持たせることができる。
例:
<?php
print add(20, 99);
function add($i, $j){
return $i + $j;
}
?>
出力結果
119
引数は、括弧のなかへ記述する。
変数のスコープ
関数の外で定義した変数をグローバル変数、 関数の中で定義した変数をローカル変数と呼ぶ。
通常、グローバル変数を関数内で使用することはできない。 また、ローカル変数を関数外で使用することはできない。
特別な指定のない限り、グローバル変数とローカル変数はお互いに干渉しない。
このような、変数の使える範囲のことを、スコープ(Scope) と呼ぶ。
<?php
$i = 10;
print "グローバル変数{$i} <br>";
f();
function f() {
$i = 99;
print "ローカル変数{$i} <br>";
}
print "グローバル変数{$i} <br>";
?>
- 実行結果
グローバル変数10 ローカル変数99 グローバル変数10
このとき、f() の中に、変数 $i があり、グローバルスコープにも、変数 $i がある。しかし、これらは別物である。
しかし、下記のように global 宣言子を使うと、関数内からグローバル変数を書き換えることができる。
- コード例
<?php
$i = 10;
print "グローバル変数{$i} <br>";
f();
function f() {
global $i ;
$i = 99; // 1行に global $i = 99; と まとめるとエラー
print "ローカル変数{$i} <br>";
}
print "グローバル変数{$i} <br>";
?>
- 実行結果
グローバル変数10 ローカル変数99 グローバル変数99
3行目のグローバル変数の値が 99 に置き換わっていることに注目してもらいたい。
- その他
<?php
$s = 99;
f();
function f() {
global $s;
$i = $s * $s;
print "sの二乗は{$i}です。 <br>";
}
?>
- 実行結果
sの二乗は9801です。
発展的な話題
関数内の関数
PHPでは、ユーザ定義関数の中に別のユーザ定義関数の定義を書き、またその別関数を呼び出して利用する事もできます。
一般に、このような機能をプログラミング用語で「内部関数」と言いますが、PHPでは別の意味で「内部関数」という用語がすでに使われているので、本wikiページでは「関数内関数」と呼ぶことにします。
この機能は、あまり市販の書籍に書かれてはいないですが、普通にwebブラウザでも動きます。
- 例
<?php
function soto()
{
function uti()
{
print "abc<br>";
}
uti();
uti();
}
soto();
?>
- ※(動作確認: 2020年6月24日に Fedora32上の Firefox で動作を確認ずみ。)
- 実行結果
abc abc
なお、PHPでは、関数内関数は定義さえすれば、どこからでも自由に関数内関数を呼び出せます。比喩的に言うなら、関数内関数は「グローバル関数」です。
下記コードのように書いても、動作して、
<?php
function soto()
{
function uti()
{
print "abc<br>";
}
uti();
uti();
}
soto();
uti();
?>
実行結果は
abc abc abc
となります。
アロー関数
数値計算
PHP7.4以降、アロー関数という機能が追加されており、下記のような1個の命令の内容の関数を定義できます。
書式は
$値を格納する変数 = fn($引数) => 関数の内容の式
です。
fn
は予約語ですので、変更できません(変更してもエラーになるので実行不可能です)。
また、 =>
は(不等号ではなく、)アロー演算子という演算子ですので、混同しないように。
<?php
// 定義方法
$atai = fn($hiki) => $hiki * 7;
// 出力
print($atai(2)); // 14 なぜなら 2×7=14 なので
print("\n"); // 改行
print($atai(5)); // 35 なぜなら 5×7=35 なので
?>
実行結果
14 35
となります。
アロー関数の定義の命令自体は1個の命令だけで構成される必要がありますが、アロー関数自体は1回以上でも何度でも呼び出せて使えます。
数値計算以外
数値計算でなくても、関数の命令内容が1個なら、アロー関数が定義および利用できる場合もあります。
また、引数を用いない場合、下記コード例のように、アロー関数の宣言文から引数を省略できます。
コード例
<?php
$atai = fn() => print("test ");
// 使い方
$atai();
$atai();
?>
実行例
test test