テクノロジー

2023年2月2日

関数定義と引数の種類

  • 関数のさまざまな引数の設定方法を理解する
  • 関数定義、実行時のエラーに慣れておく

PHPの関数定義

PHPではさまざまな組み込み関数(ビルトイン関数)が用意されていますが、もちろん自分で関数を定義できます。
三角形の面積を求める関数を定義してみましょう。

[例]

<?php
 
// 関数の定義
function calculateTriangleArea($vertical, $width) {
    return ($vertical * $width) / 2;
}
// 呼び出し
echo calculateTriangleArea(10, 20) . PHP_EOL;

[実行結果]

100

PHPの関数は 関数名() {} で定義します。
関数名の後ろの()には引数を定義することができ、その引数は同名の変数として関数内で利用できます。
関数を定義すると何度も使い回すことができたり、プログラムの中の処理を関数に切り出すことでプログラムの可読性が上がります。

例えば、多角形の辺の数と、縦・横の長さを入力して面積を出すプログラムを考えてみます。辺の数が3の場合は三角形の面積を、4であれば四角形の面積を求めます。

[例]

<?php
 
$number_of_sides = 3; // 辺の数
$vertical = 10; // 縦
$width = 20; //横
 
switch ($number_of_sides) {
    case 3: // 三角形の場合
        echo $vertical * $width / 2 . PHP_EOL;
        break;
    case 4: // 四角形の場合
        echo $vertical * $width . PHP_EOL;
        break;
    default:
        echo '計算できません' . PHP_EOL;
}

case の後に直接処理の内容を記述すると、何をしているのかわかりづらいです。
関数を使ってみましょう。

[例]

<?php
 
// 三角形の面積を求める関数
function calculateTriangleArea($vertical, $width) {
    return ($vertical * $width) / 2;
}
 
// 四角形の面積を求める関数
function calculateQuadrangleArea($vertical, $width) {
    return $vertical * $width; 
}
 
$number_of_sides = 3; // 辺の数
$vertical = 10; // 縦
$width = 20; // 横
 
switch ($number_of_sides) {
    case 3:
        echo calculateTriangleArea($vertical, $width) . PHP_EOL;
        break;
    case 4:
        echo calculateQuadrangleArea($vertical, $width) . PHP_EOL;
        break;
    default:
        echo '計算できません' . PHP_EOL;
}

コードとしては長くなりましたが、case の後にわかりやすい名前の関数が記述されているため、switch で何をしているのかがわかりやすくなりました。
このように、関数を定義するときは何をする関数なのかがわかりやすいネーミングにすることも大切です。

さまざまな引数の設定方法

PHPの関数の引数にはさまざまな定義方法があります。

デフォルト値を設定する

引数にあらかじめデフォルト値を設定できます。
使用時に引数を設定しなければデフォルト値が使用され、引数を定義すると、その引数が使われます。

[例]

<?php
 
// 三角形の面積を求める関数
function calculateTriangleArea($vertical = 10, $width = 50) {
    return ($vertical * $width) / 2;
}
 
echo calculateTriangleArea() . PHP_EOL; // 引数を省略して実行
echo calculateTriangleArea(20, 30) . PHP_EOL; // 引数を渡して実行

[実行結果]

250
300

このように関数を定義する際に、引数=値という形でデフォルト値を設定できます。

名前付き引数

引数が何を意味するのか、どんな値を引数として渡せばよいのかをわかりやすくするために、関数呼び出し時に名前と一緒に引数を書くことができる引数があります。それが名前付き引数です。

下記の例は、縦・横の長さの他に引数に三角形かどうかを truefalse で渡し、true なら2で割って三角形の面積を、false なら四角形の面積を返す関数です。

[例]

<?php
 
function calculateArea($vertical = 10, $width = 50, $triangle = true) {
    $area = $vertical * $width;
    return $triangle ? $area / 2 : $area;
}
 
echo calculateArea(vertical: 20, width: 50, triangle: true) . PHP_EOL;

[実行結果]

500

関数を定義する際に、$名前 = デフォルト値という形で設定し、使う時は calculateArea(vertical: 10, width: 50, triangle: true) のように名前と一緒に引数を渡します。
名前付き引数にはデフォルト値が設定されているため、デフォルト値を使用する場合は省略できます。

[例]

<?php
 
function calculateArea($vertical = 10, $width = 50, $triangle = true) {
    $area = $vertical * $width;
    return $triangle ? $area / 2 : $area;
}
 
echo calculateArea(width: 100) . PHP_EOL; // vertical: 10とtriangle: trueを省略

[実行結果]

500

上記の関数を名前付き引数なしで定義した場合、以下のようになります。

[例]

<?php
 
function calculateArea($vertical, $width, $triangle) {
    $area = $vertical *$width;
    return $triangle ? $area / 2 : $area;
}
 
echo calculateArea(20, 50, true)

calculateArea(20, 50, true) だけを見て、何を引数として渡しているのか予想できません。
このような時に名前付き引数を設定しておくと可読性が上がります。

また、名前付き引数を使わない場合、関数に定義されている順番で引数を記述しなければなりません。一方で、名前付き引数を設定している場合は順番を変えることができます。

[例]

<?php
 
function calculateArea($vertical = 10, $width = 50, $triangle = true) {
    $area = $vertical * $width;
    return $triangle ? $area / 2 : $area;
}
 
echo calculateArea(triangle: false, width: 100) . PHP_EOL; // 引数の順番を関数定義と変える

[実行結果]

1000

また、名前付き引数を使い、かつデフォルト値を省略することもできます。

<?php
 
function calculateArea($vertical, $width, $triangle) {
    $area = $vertical * $width;
    return $triangle ? $area / 2 : $area;
}
 
echo calculateArea(vertical: 10, width: 50, triangle: true) . PHP_EOL;

なお、名前付き引数はPHP 8.0.0から導入されました新しい機能です。
PHP 8.0.0以前のバージョンでは使用できないので、PHPのバージョンに注意しましょう。

可変長引数

可変長引数とは、引数の数に制限がない引数のことです。可変長引数をとる関数を定義する場合は、...引数のように...を使って定義します。
以下の例は、引数に渡された商品名を出力するプログラムです。

[例]

<?php
 
function shopping(...$products){
    print_r ($products);
}
 
shopping("milk", "apple", "banana");

[実行結果]

Array
(
    [0] => milk
    [1] => apple
    [2] => banana
)

引数を ...$product として可変長引数にすることで、引数の数を制限せず受け取ることができました。
通常の引数と合わせて使うこともできます。

[例]

<?php
 
function shopping($store, ...$products){
  print_r($store . 'で買ったもの' . PHP_EOL);
  print_r($products);
  
}
 
shopping('DICスーパー', 'milk', 'apple', 'banana');

[実行結果]

DICスーパーで買ったもの
Array
(
    [0] => milk
    [1] => apple
    [2] => banana
)

ArgumentCountErrorとは

関数を定義して使用するとによく起こるエラーとして ArgumentCountError があります。ArgumentCountError は引数が期待通りでないときに起こるエラーです。
ArgumentCountError が起こる例を見てみましょう。

[例]

<?php
 
function calculateTriangleArea($vertical, $width){
    return $vertical * $width / 2;
}
 
// 呼び出し
echo calculateTriangleArea(10);

[実行結果]

PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function calculateTriangleArea(), 1 passed in /Users/Desktop/sample_php/sample.php on line 8 and exactly 2 expected in /Users/Desktop/sample_php/sample.php:3
Stack trace:
#0 /Users/Desktop/sample_php/sample.php(8): calculateTriangleArea()
#1 {main}
  thrown in /Users/Desktop/sample_php/sample.php on line 3

このようなエラーが発生します。このエラーは、”引数が二つ渡されてくることを期待していたのに、一つしか渡されていないです”という意味です。コードを確認すると、calculateTriangleArea(10) と、確かに一つしか引数を渡していません。
これから関数を定義していくにあたり、よく遭遇するエラーです。ArgumentCountError が起きた場合は、引数を確認するようにしましょう。

まとめ

  • 関数を定義するときは、何をする関数なのかがわかりやすいネーミングにする。
  • 引数にはデフォルト値や名前を設定できる。
  • ArgumentCountErrorは、引数が期待通りでないときに起こるエラーである。

ダイビックのことをもっと知ってみませんか?