環境
- windows10
- DockerDesktop for Win 3.5.x
- PHP 8.x
- VsCode
- gitbash 2.32.0.1
functionに関するいろいろな知識
シンプルなfunction
function greet() {
echo "hello";
}
greet();
// hello
呼び出し側で引数を渡す
function greet($greeting) {
echo $greeting;
}
greet("hello");
// hello
データ型をつける
function greet(string $greeting) : void {
echo $greeting;
}
greet("hello");
// hello
関数の引数について
値渡しと参照渡し
- 引数の渡し方として、値渡しと参照渡しがある
- 引数を参照渡しで指定すると、関数内部から関数外部の変数の値を直接操作できる
- 引数を参照渡しにするには引数の前に「&(アンパサンド)」をつける
- 特別な理由がある限り参照渡しで処理をしないほうが無難
引数で参照渡し
//関数外部で変数を作成
$num = 5;
//関数を定義
function change ( &$num ) {
$num = 5000;
return $num;
}
//関数呼び出し
$result = change( $num );
var_dump($result);
// int(5000)
useで参照渡し
$num = 5;
// useでも同様に参照渡しが可能
$change = function () use (&$num) {
$num = 5000;
return $num;
};
var_dump($change());
// int(5000)
引数のデフォルト値
- 引数に初期値を持たせることができる
- 呼び出し側で引数に値を指定しなかった場合は常にデフォルト値を使用することができる
function calc($num = 100) {
$num * 2;
return $num;
};
var_dump(calc());
// int(100)
変数のスコープについて
- ローカルスコープ
関数内スコープ - グローバルスコープ
関数内で定義されていない変数のスコープ。
※グローバルという名前ですが、関数内で直接使用する事は不可(useもしくは後述のアロー関数で使用可能) - スーパーグローバル
$_GETや$_POSTなど全てのスコープで使用できる組み込みの変数
グローバル変数の$xは関数内では使用できない。この場合はuseキーワードで参照することが可能です。
$x = 1;
$calc = function() use($x) {
return $x * 2;
};
var_dump($calc());
// int(2)
なお、if文・foreach文等のブロックはグローバルスコープなので、{}の中から参照できるため以下のようになる
$x ="hello";
// グローバル変数を{}の中で参照できる(やや無理やり)
foreach ([1,2,3] as $value) {
echo $x . "\n";
}
//
hello
hello
hello
$x ="hello";
if ($x !== "") {
echo $x;
}
// hello
無名関数
- クロージャ―とも呼ばれる
- 関数名を指定せずに関数を作成できる
- 変数に代入することが可能
$greet = function(string $greeting) : string {
return $greeting;
};
var_dump($greet("good morning"));
// string(12) "good morning"
- クロージャで変数を親のスコープから引き継ぐことが可能。引き継ぐ変数は use を使用する
- 戻り値の型は、use の後に指定する
$greeting = "good morning";
$greet = function() use($greeting) : string {
return $greeting;
};
var_dump($greet());
// string(12) "good morning"
コールバック関数
- 関数を呼び出す際に引数として引き渡される別の関数のこと
- PHPでは、引数としてコールバック関数をとるビルトイン関数が複数存在しており、array_reduce、array_map、array_filterなどがある
例えば、array_reduce(第一引数の配列の要素に対して第二引数に指定したコールバック関数を適用し一つの要素にまとめる)は以下のようになる
// クロージャ―
$result1 = array_reduce([1, 2, 3, 4], function($total, $number) {
return $total += $number;
});
// 後述のアロー関数
$result2 = array_reduce([1, 2, 3, 4], fn($total, $number) => ($total += $number));
var_dump($result1);
var_dump($result2);
//
int(10)
int(10)
アロー関数
- PHP7.4から導入された
- 現状は一行しか書けない( {} が使用できない)
- retrunを省略できる
- 複数行の記述は、PHP8.1での導入を目標としているそう
- useキーワードを使用せずとも、グローバル変数を参照できる
$x = 1;
// クロージャ
$calc = function() use($x) {
return $x * 2;
};
// アロー関数
$calc2 = fn() => $x * 2;
var_dump($calc());
var_dump($calc2());
// いずれの結果も int(2)
- グローバル変数を使用する場合、参照渡しではなく暗黙的に値渡しとなるので、スコープ内から変数自体を変更することはできない(=関数の外から参照渡しで変数を渡すことは不可)
$x = 1;
// アロー関数で$xを100にしても出力結果は1
$calc2 = fn() => $x = 100;
var_dump($x);
// int(1)
以上です。
まとめ
いかがでしたでしょうか。本記事では、PHPでプログラミング開発を行う上で最低限知っておくべきfunctionについての基礎知識について紹介しています。特徴のある振る舞いを行うものもありますので、ぜひ参考にしてみてください。