プログラミング学習記録 #11 関数

一連の処理を一つの命令にひとまとめにしたもの

function 関数名(型 引数):返り値の型
{
    処理
}

呼び出し元から引数を渡して関数から返り値が返ってくる

●引数の種類

・値渡し:デフォルト、引数の値がコピーして渡される

・リファレンス渡し:同じ変数本体に対して別の名前に変更できる

関数に渡した変数そのものを変更できる

変更がわかりにくい場合がありバグの温床になるためあまり使わない方が良い

function change(&$string)
{
    $string = 'after';
}
$str = 'before';
change($str);
echo $str;

// 'after'


・デフォルト引数

引数を指定しなかったら指定したデフォルトの値が入る、引数を指定した場合は上書きされる

function purchase($num = 1)
{
    return $num . '個購入';
}
echo purchase(); 
// 1個購入
echo purchase(3); 
// 3個購入


・可変長引数:引数の数を任意の数に指定できる

引数の数が分からない場合に使用できる

function product(...$numbers)
{
    $sum = 1;
    foreach ($numbers as $n) {
        $sum *= $n;
    }
    return $sum;
}
echo product(2, 4, 8);
// 64


・名前つき引数:引数に名前をつける

呼び出し時に名前を指定すると指定した引数に値が渡される

引数の順番を気にせずに渡したい引数が渡せる

※複数の引数で一部の引数のみの値を渡す場合はデフォルト値を設定しておく必要がある

function register($name = null, $age = null)
{
    $inputs = ['name' => $name, 'age' => &age];
    foreach ($inputs as $k => $v) {
        if(isset($v)) {
            echo $k . 'に' . $v . 'を登録' . PHP_EOL;
        }
    }
}
register(age: 10);
// ageに10を登録


●返り値

・関数の返り値はreturn文で返せる

※返り値で返せるのは一つの値のみ

=> 複数の値を返したい場合は配列を活用する

・return文を省略した場合はnullが返される

function double($num)
{
   return $num * 2;
}

echo double(2) . PHP_EOL;
// 4


●可変関数

関数の呼び出しを動的に行える

function add($x, $y)
{
   echo $x + $y;
}

function sub($x, $y)
{
   echo $x - $y;
}

$calc = 'sub';
echo $calc(20, 10) . PHP_EOL;

$inputs = [
   ['sub', 20, 10],
   ['add', 20, 10],
];

foreach ($inputs as $input) {
   echo $input[0]($input[1], $input[2]) . PHP_EOL;
}

//
10
10
30


●無名関数(クロージャ)

関数名を持たず、値として受け渡しできる関数

関数の引数に関数を使いたい場合に使うことが多い

省スペースでスッキリ書ける

$numbers = [1, 2, 3];
$double = array_map(function($num) {
   return $num * 2;
}, $numbers);

var_export($double);
//
array (
 0 => 2,
 1 => 4,
 2 => 6,
)

無名関数で親のスコープの変数を使いたい場合はuseを使う

※useを使用しなかったら警告が出る(Undefined variable $time)

$time = 3;
$numbers = [1, 2, 3];
$double = array_map(function($num) use ($time) {
   return $num * $time;
}, $numbers);

var_export($double);


●アロー関数

無名関数を簡単に書く構文

基本的に無名関数と同じ機能

※無名関数との相違点はアロー関数は親スコープの変数を自動で使える

fn(引数) => 式
$time = 3;
$numbers = [1, 2, 3];
$double = array_map(fn($num) => $num * $time, $numbers);

var_export($double);








この記事が気に入ったらサポートをしてみませんか?