「PHP/入門/関数とは」の版間の差分
削除された内容 追加された内容
→型指定の新機能: PHPの新旧によって、異なる型の加減乗除では型の扱いが異なるので、事前にテストして確認しておきましょう。 |
→無名関数: 関数の中で関数を定義してもクロージャーにはなりませんが、無名関数でクロージャーを実現できます。 PHPには、無名関数を定義する方法に、アロー関数と関数式の2つがあります。 タグ: 2017年版ソースエディター |
||
8 行
;ユーザー定義関数の例:<syntaxhighlight lang=php>
<?php
f();
33 ⟶ 32行目:
関数をユーザーが定義するには、function 宣言を使い、波カッコ { } の中に処理をかく。
:書式:<syntaxhighlight lang=php>
function 関数名(引数) {
// させたい処理をカッコ内に書く
}
</syntaxhighlight>
PHPで関数を実行させたい場合には、phpタグ内で関数の名前(上記コードでは「f」が名前)を書くだけで、{ }カッコ内の処理を行ってくれる。
60 ⟶ 56行目:
例えば、下記のコードは、単純に関数fが1を返す関数である。
:<syntaxhighlight lang=
<?php
$a = f();
function f(){
83 ⟶ 79行目:
;参考
:<syntaxhighlight lang=
<?php
$num = pi();
102 ⟶ 98行目:
関数には引数(ひきすう)を持たせることもできる。引数とは、関数の呼び出し時に値を渡して処理させるために、渡す値のこと。引数は複数個でも単数個でも0個でも構わない。PHPに限らず一般にプログラミング言語は関数に引数を持たせることができる。
;例:<syntaxhighlight lang=php>
<?php
print add(20, 99);
function add($i, $j) : {
return $i + $j;
}
?>
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
119
</syntaxhighlight>
:引数は、括弧のなかへ記述します。
==== 型宣言 ====
型宣言は、関数の引数や返り値、そして PHP 7.4.0 以降ではクラスのプロパティに追加することができます。これらは、呼び出し時に指定した型の値であることを保証し、 そうでない場合は TypeError がスローされます。
strict_types を 1 にセットすると、型宣言漏れをエラーにできます。
:<syntaxhighlight lang=php line highlight=6>
<?php
declare(strict_types=1);
$y = 7;
$fn1 = fn(int $x) : int => $x + $y;
$fn2 = function
return $
};
echo '$fn1(3) --> ', $fn1(3), PHP_EOL;
echo '$fn2(3) --> ', $fn2(3), PHP_EOL;
$y = 1;
echo '$fn1(3) --> ', $fn1(3), PHP_EOL;
echo '$fn2(3) --> ', $fn2(3), PHP_EOL;
?>
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
10119
</syntaxhighlight>
==== 有効な型 ====
プリミティブ型のほか、クラスやインターフェースの名前は、型名として認識されます。
:{| class="wikitable"
|+ PHPの関数の引数や戻値の型
!型
!説明
!バージョン
|-
| classまたはinterfacd の名前
| 値は与えられたクラスまたはインターフェースのインスタンスでなければならない。
|
|-
|self
| 値は型宣言が使用されているクラスと同じクラスのインスタンスでなければならない。クラス内でのみ使用可能。
|
|-
|parent
|型宣言が使われているクラスの親のインスタンスでなければならない。クラス内でのみ使用可能。
|
|-
|array
|値は配列でなければならない。
|
|-
|callable
|値は有効な callable である必要があります。クラスのプロパティの型宣言としては使用できません。
|
|-
|bool
|値はブール値でなければならない。
|
|-
|float
|値は浮動小数点数でなければならない。
|
|-
|int
|値は整数値でなければならない。
|
|-
|string
|値は文字列でなければならない。
|
|-
|iterable
|値は、配列か Traversable のインスタンスでなければなりません。
|PHP 7.1.0
|-
|object
|値はオブジェクトでなければなりません。
|PHP 7.2.0
|-
|mixed
|値は任意の値であることができます。
|PHP 8.0.0
|}
=== 変数のスコープ ===
190 ⟶ 206行目:
このような、変数の使える範囲のことを、スコープ(Scope) と呼ぶ。
:<syntaxhighlight lang=
<?php
$i = 10;
220 ⟶ 236行目:
;コード例
:<syntaxhighlight lang=
<?php
$i = 10;
249 ⟶ 265行目:
;その他
:<syntaxhighlight lang=
<?php
$s = 99;
265 ⟶ 281行目:
sの二乗は9801です。
{{コラム|関数内で関数を定義しても関数スコープにはならない|2=
関数の中で別の関数を定義することは可能ですが意味はありません。
;例:<syntaxhighlight lang=php>
<?php
declare(strict_types=1);
function outer() {
function inner() {
global $y;
echo __FUNCTION__, "\$y = $y", PHP_EOL;
}
inner();
}
$y = 0;
// outer(); PHP Fatal error: Cannot redeclare inner() (previously declared in /workspace/Main.php:7) in /workspace/Main.php on line 6
inner();
?>
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
inner$y =
inner$y =
inner$y =
inner$y = 0
</syntaxhighlight>
: 関数の中で別の関数を定義することは可能ですが意味はありません。
: 定義した関数の中で inner() を呼び出すことは複数回できます。
: 定義した関数を抜けたあとも、定義した関数を呼び出すことはできます。
: ですが、関数内で定義された関数から「外側の」ローカル変数は参照できません。
: global 宣言した変数は、「外側の」ローカル変数ではなくトップレベルの変数です。
: あまつさえ、関数を定義する関数を二回呼び出すと、<code>PHP Fatal error: Cannot redeclare</code> と致命的エラーです。
; これは、関数内で別の関数を定義しても関数スコープにはならず'''クロージャではない'''ことを表しています。
}}
=== 無名関数 ===
関数の中で関数を定義してもクロージャーにはなりませんが、無名関数でクロージャーを実現できます。
PHPには、無名関数を定義する方法に、アロー関数と関数式の2つがあります。
;[https://paiza.io/projects/B3_gFsPL2r0L3mL4XRuLtQ?language=php 例]:<syntaxhighlight lang=php line highlight=9>
<?php
$y = 7;
$fn2 = function ($x) use ($y) {
};
echo '$fn1(3) --> ', $
echo '$fn2(3) --> ', $fn2(3), PHP_EOL;
$y = 1;
echo '$fn1(3) --> ', $fn1(3), PHP_EOL;
echo '$fn2(3) --> ', $fn2(3), PHP_EOL;
?>
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
$fn1(3) --> 10
$fn2(3) --> 10
$fn1(3) --> 10
$fn2(3) --> 10
</syntaxhighlight>
:<code>fn($x) => $x + $y;</code>の<code>=></code>が矢印っぽいのでアロー関数と呼ばれます。
::この記号は <code>{ 'a' => 1 }</code> (連想配列)でも使われます。
:<code>function ($x) use ($y) { return $x + $y;};</code>は、関数式です。
::関数定義とよく似ていますが名前がありません。
::use でキャプチャーする環境を指定します。
:;キャプチャー
::上の実行結果をよく見ると9行目 <code>$y = 1;</code>のあとも答えが変わっていません。
::このようにアロー関数や関数式(まとめて無名関数)は、定義されたときの環境をキャプチャーします。
::このようキャプチャーを行う性質から、無名関数は、しばしまクロージャーと呼ばれます。
::: 無名関数の中で __FUNCTION__ を参照すると、<code>{closure}</code> となります。
[[Category:PHP|にゆうもん かんすうとは]]
|