サーチ…
構文
- 関数func_name($ parameterName1、$ parameterName2){コード_to_run(); }
- 関数func_name($ optionalParameter = default_value){コード_to_run(); }
- 関数func_name(型名$パラメータ名){コード_to_run(); }
- 関数&returns_by_reference(){コード_to_run(); }
- 関数func_name(&$ referenceParameter){コード_to_run(); }
- 関数func_name(... $ variadicParameters){コード_to_run(); } // PHP 5.6+
- 関数func_name(型名&... $ varRefParams){コード_to_run(); } // PHP 5.6+
- ファンクションfunc_name():return_type {code_To_run(); } // PHP 7.0+
基本機能の使用法
基本的な関数が定義され、次のように実行されます。
function hello($name)
{
print "Hello $name";
}
hello("Alice");
オプションのパラメータ
関数にはオプションのパラメータを指定できます。たとえば、次のようになります。
function hello($name, $style = 'Formal')
{
switch ($style) {
case 'Formal':
print "Good Day $name";
break;
case 'Informal':
print "Hi $name";
break;
case 'Australian':
print "G'day $name";
break;
default:
print "Hello $name";
break;
}
}
hello('Alice');
// Good Day Alice
hello('Alice', 'Australian');
// G'day Alice
引数を参照渡しで渡す
関数の引数は "参照で渡す"ことができ、関数の外部で使用される変数を変更することができます。
function pluralize(&$word)
{
if (substr($word, -1) == 'y') {
$word = substr($word, 0, -1) . 'ies';
} else {
$word .= 's';
}
}
$word = 'Bannana';
pluralize($word);
print $word;
// Bannanas
オブジェクト引数は常に参照渡しされます:
function addOneDay($date)
{
$date->modify('+1 day');
}
$date = new DateTime('2014-02-28');
addOneDay($date);
print $date->format('Y-m-d');
// 2014-03-01
オブジェクトを参照渡しで暗黙的に渡すのを避けるには、オブジェクトをclone
する必要があります。
参照渡しは、パラメータを返す別の方法としても使用できます。たとえば、 socket_getpeername
関数はsocket_getpeername
ます。
bool socket_getpeername ( resource $socket , string &$address [, int &$port ] )
このメソッドは、実際にはピアのアドレスとポートを返すことを目的としていますが、返す値が2つあるため、代わりに参照パラメータを使用することを選択します。これは次のように呼び出すことができます:
if(!socket_getpeername($socket, $address, $port)) {
throw new RuntimeException(socket_last_error());
}
echo "Peer: $address:$port\n";
変数$address
と$port
は事前に定義する必要はありません。彼らは:
- まず
null
として定義され、 - あらかじめ定義された
null
値を持つ関数に渡されます - 関数で変更された
- 呼び出しコンテキストのアドレスとポートとして定義されます。
可変長引数リスト
PHP 5.6では、可変長引数リスト(別名varargs、可変引数)が導入されました...
引数名の前に...
tokenを使用して、パラメータが可変的であることを示しました。つまり、それ以降のすべてのパラメータを含む配列です。
function variadic_func($nonVariadic, ...$variadic) {
echo json_encode($variadic);
}
variadic_func(1, 2, 3, 4); // prints [2,3,4]
タイプ名は...
前に追加でき...
:
function foo(Bar ...$bars) {}
&
reference演算子は、 ...
前にタイプ名の後に追加できます(存在する場合)。この例を考えてみましょう。
class Foo{}
function a(Foo &...$foos){
$i = 0;
foreach($a as &$foo){ // note the &
$foo = $i++;
}
}
$a = new Foo;
$c = new Foo;
$b =& $c;
a($a, $b);
var_dump($a, $b, $c);
出力:
int(0)
int(1)
int(1)
一方、引数の配列(またはTraversable
)をアンパックして、引数リストの形式で関数に渡すことができます。
var_dump(...hash_algos());
出力:
string(3) "md2"
string(3) "md4"
string(3) "md5"
...
使用せずに、このスニペットと比較し...
:
var_dump(hash_algos());
出力:
array(46) {
[0]=>
string(3) "md2"
[1]=>
string(3) "md4"
...
}
したがって、以下のようにバリデーション関数のリダイレクト関数を簡単に作成できます。
public function formatQuery($query, ...$args){
return sprintf($query, ...array_map([$mysqli, "real_escape_string"], $args));
}
配列とは別に、 Iterator
(特にSPLのサブクラスの多く)などのTraversable
も使用できます。例えば:
$iterator = new LimitIterator(new ArrayIterator([0, 1, 2, 3, 4, 5, 6]), 2, 3);
echo bin2hex(pack("c*", ...$it)); // Output: 020304
イテレータが無限に反復する場合、たとえば次のようになります。
$iterator = new InfiniteIterator(new ArrayIterator([0, 1, 2, 3, 4]));
var_dump(...$iterator);
さまざまなバージョンのPHPが異なる動作をします:
- PHP 7.0.0からPHP 7.1.0(ベータ1)まで:
- セグメント化障害が発生する
- PHPプロセスはコード139で終了します
- PHP 5.6では:
- メモリ枯渇の致命的なエラー(「使用可能なメモリサイズの%dバイトが使い果たされました」)が表示されます。
- PHPプロセスはコード255で終了します。
注意:HHVM(v3.10 - v3.12)は
Traversable
のアンパックをサポートしていません。この試行では、「コンテナのみを開梱する」という警告メッセージが表示されます。
機能範囲
関数内の変数は、このようなローカルスコープ内にあります
$number = 5
function foo(){
$number = 10
return $number
}
foo(); //Will print 10 because text defined inside function is a local variable