山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

PHP 学習 part. 5

制御構造と関数

制御構造と関数の続きです。

goto

goto 文は使用しない方が良いという見方がありますが、適切に使えば問題ないと思います。

label 付き for 文のような使い方ができます。

<?php

for ($i = 1; $i < 10; $i++) {
    for ($j = 1; $j < 10; $j++) {
        echo $i * $j, PHP_EOL;
        if (($j * $j) % 12 == 0) goto loop;
    }
    loop:
        echo $i * $j, PHP_EOL;
}

関数

関数は、function を付けて定義します。

<?php

function factorial($n)
{
    if ($n == 1) return 1;
    return $n * factorial($n - 1);
}

echo factorial(5), PHP_EOL; // 120

引数の型を指定

関数に渡す引数の型を指定するタイプヒンティングを行います。

【PHP】タイプヒンティング - Qiita

$a = array(1, 2, 3);
dispArray($a);
dispArray(1); // エラー

コールバック関数

あまり使ったことがない機能ですが、コールバック関数について学びます。

<?php

function add($v1, $v2)
{
    return $v1 + $v2;
}

class Math
{
    public function mul($v1, $v2)
    { 
        return $v1 * $v2;
    }

    public static function add($v1, $v2)
    {
        return $v1 + $v2;
    }
}

// コールバック関数
echo call_user_func('add', 1, 2), PHP_EOL;

// static メソッドの場合、クラス名を文字列で指定できる
echo call_user_func(array("Math", "add"), 1, 6), PHP_EOL;
echo call_user_func("Math::add", 2, 5), PHP_EOL;

// インスタンスを指定
$math = new Math();
echo call_user_func(array($math, 'mul'), 5, 7), PHP_EOL;

// 引数に配列を指定
$v = array(5, 7);
echo call_user_func_array('add', $v), PHP_EOL;

Unity とかで使った覚えがありますね。

パーフェクトPHP

パーフェクトPHP