PHP/入門/関数とは

< PHP

基本編集

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

引数は、括弧のなかへ記述する。

型指定の新機能編集

2021年現在、最近のPHP7以降では、関数の引数で型を指定することができます。

現在のところ、単に変数を宣言する場合には、型宣言は不可能です。

型宣言をするには、下記のように関数の引数の中での宣言など、一部の機能でのみ、型宣言が可能です。

<?php

print add(10020, 99);

function add(int $i, int $j){
    return $i + $j;
}

?>

結果

10199


intとは、整数型を意味する予約語です。PHPにかぎらずC言語でも整数型の予約語は int です。


古いバージョンのPHPでは、上記コードのadd のカッコ()の中を整数ではなく小数などにすると、上記の型指定したコードでは、その引数はむりやり整数に変換される仕様でした。


<?php

print add(5000.1234, 99);

function add($i, $j){
    return $i + $j;
}

?>

結果

※ 古いバージョンのPHPの場合
5099

※ PHP8.1およびPHP8.2αでテストしたところ、

5099.1234

になった。

このように、PHPの新旧によって、異なる型の加減乗除では型の扱いが異なるので、事前にテストして確認しておきましょう。


入門的な型としては、

整数型の int
浮動小数点型の float
文字列型の string

などがあります。

変数のスコープ編集

関数の外で定義した変数をグローバル変数、 関数の中で定義した変数をローカル変数と呼ぶ。

通常、グローバル変数を関数内で使用することはできない。 また、ローカル変数を関数外で使用することはできない。

特別な指定のない限り、グローバル変数とローカル変数はお互いに干渉しない。

このような、変数の使える範囲のことを、スコープ(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