サーチ…


構文

  • 関数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は事前に定義する必要はありません。彼らは:

  1. まずnullとして定義され、
  2. あらかじめ定義されたnull値を持つ関数に渡されます
  3. 関数で変更された
  4. 呼び出しコンテキストのアドレスとポートとして定義されます。

可変長引数リスト

5.6

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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow