著者は、 Write for DOnations プログラムの一環として、 Open Sourcing Mental IllnessLtdを選択して寄付を受け取りました。

序章

プログラムのさまざまなセクションで再利用するためにコードのブロックをコピーして貼り付けると、関数を作成する準備が整います。 変数の内容を操作する必要がある場合(大文字と小文字を変更する、長さを見つける、トリミングする、または並べ替える)、おそらくそのための組み込み関数があります。 関数は、特定のタスクを実行する自己完結型の再利用可能なコードブロックです。 これらはモジュール性を提供し、コードを再利用する1つの方法です。

関数は、と呼ばれるまで休止状態になります。 関数が呼び出されると、関数で定義されたタスクが実行されます。 関数は通常、入力を受け取り、アクションを実行し、は結果の出力を返します。 関数内で実行されるアクションは、入力と出力の間に関係を構築します。 関数を操作するときに考慮すべき3つの主要な部分は、入力、関係、および出力です。 入力が明示的でない場合でも、通常、コードの環境に関連する暗黙的なデータ(日付、時刻、システム、ファイル、行番号など)があります。

このチュートリアルでは、関数のさまざまな部分をすべて操作して、課題を解決するための最良の方法で関数を使用できるようにします。 まず、ユーザー定義関数を作成します。 これらの関数は、引数とパラメーターの違いを明確にし、値と参照で変数を渡し、デフォルト値を設定し、型宣言を使用して入力と出力の受け入れ可能な型を指定します。 スコープを理解することで、他の部分に手を加えずに、変更が必要なコードの特定のセクションを操作できるようになります。 関数のさまざまな側面と、それらがスコープによってどのように影響を受けるかを理解すると、PHPが提供する多くの組み込み関数のドキュメントをすぐに読んで理解できるようになります。 組み込み関数を使用して、一般的なプログラミングタスクを簡単に実行します。

ユーザー定義関数

同じコードを複数の場所に記述していると、プロジェクトを読んだり理解したりするのが難しくなります。 プログラミングの「核となる信条」または基本原則の1つは、DRYプログラミングと呼ばれることが多い「自分自身を繰り返さない」ことです。 変数は、同じデータを何度も書き込めないようにします。 関数は、同じアクションを何度も書くことを防ぎます。

関数の作成と呼び出し

関数を作成するときは、最初に関数の構造を構築する必要があります。 このコードブロックは、と呼ばれるか、が呼び出されるまで休止状態のままです。 関数は、functionキーワードに加えて、選択した名前とそれに続く括弧を使用して作成されます。 関数の本体は中括弧で囲まれ、アクションを実行するコードです。

hello.php
<?php
function hello() {
    echo "Hello World!";
}

helloという名前のこの関数は休止状態のままです。つまり、何も実行せず、関数が呼び出されるまでファイルは出力されません。 関数を呼び出すには、名前の後に括弧が続きます。

hello.php
<?php
function hello() {
    echo "Hello World!";
}
hello();

関数の呼び出しは、関数にそのアクションを実行させるものです。 この場合、出力が表示されます。

Output
Hello World!

この単純な例は、入力がなく、関係がなく、出力のみであるため、関数の適切な使用法ではありません。 複数の場所で使用されるデータは、代わりに次のように変数に格納する必要があります。

hello.php
<?php
$hello = "Hello World!";
echo $hello;

これらの2行は、関数および呼び出しと同じ結果を提供します。

Output
Hello World!

サンプル関数を拡張して、入力を受け入れましょう。

引数とパラメータ

入力と出力の関係を構築するhello関数を作成するには、関数が何らかの入力を受け入れる必要があります。 この入力は、関数定義の括弧の間の変数として受け入れられます。 この変数は、関数の本体内で使用できます。

hello.php
<?php
function hello($name) {
    echo "Hello ".$name;
}
hello();

関数helloは、変数$nameに格納されている1つのパラメーターを受け入れるようになりました。 この変数は、.文字列連結演算子を使用して、文字列「Hello」を$name変数に連結することにより、関数の本体で使用されます。 これで、関数は、関数が呼び出されたときに入力が渡されることをに要求しますが、入力が提供されなかったため、PHPはエラーで応答します。

Output
Warning: Uncaught ArgumentCountError: Too few arguments to function hello(), 0 passed in php shell code on line 1 and exactly 1 expected

hello関数が呼び出されると、入力として使用する引数が必要になります。これにより、$nameの値が設定されます。 パラメータという用語は、関数定義の一部である場合に使用され、引数という用語は、関数呼び出しの一部である場合に使用されます。 どちらも関数の入力を参照します。 関数に入力を提供するために、関数呼び出しの括弧の間に引数を渡します。

hello.php
<?php
function hello($name) {
    echo "Hello ".$name;
}
hello("Sammy");

これで、関数はその文字列入力を使用して挨拶の出力を作成できます。 関数を呼び出すときに渡される入力に基づいて、挨拶が変わります。

Output
Hello Sammy

これらの基本的な引数は、関数で定義されているのと同じ順序で渡す必要があるため、「位置引数」と呼ばれます。 PHPは、コンマで区切られたパラメーターの数を制限しませんが、関数は単一のアクションのみを実行する必要があります。 関数の接続については後で説明します。

オプションのデフォルト値

デフォルトでは、関数に定義されたパラメーターでは、関数呼び出しで引数を渡す必要があります。 これにより、変数から同じデータを呼び出すだけでなく、出力が一意になります。 すべてのパラメータに一意の値が必要ない場合があります。 代わりに、関数呼び出しにその引数が含まれていない場合は、特定の値を使用できます。 パラメータをオプションとして指定するには、パラメータにデフォルト値を指定します。 この値は、引数が渡されない場合に使用されます。 nullを含む任意の有効な値にすることができます。

hello.php
<?php
function hello($name, $greeting = "Hello") {
    echo $greeting." ".$name;
}
hello("Sammy", "Bonjour");

$greetingという名前の2番目のパラメーターがあります。 次に、この変数を関数の本体で使用して、出力のあいさつ部分の値を変更します。

Output
Bonjour Sammy

最初のパラメーター$nameにはデフォルト値がないため、関数を呼び出すたびに引数を含める必要があります。 2番目のパラメーターにはデフォルト値があるため、関数では2番目の引数を渡す必要はありません。

hello.php
<?php
function hello($name, $greeting = "Hello") {
    echo $greeting." ".$name;
}
hello("Sammy");

引数が1つだけ渡されると、$greeting変数の値がデフォルト値の「Hello」に設定されます。

Output
Hello Sammy

同じ関数で必須パラメーターをオプションパラメーターと一緒に使用する場合、すべての必須パラメーターがすべてのオプションパラメーターの前に来る必要があります。

オプションのNull値

変数が完全にオプションであり、値をまったく必要としない場合、デフォルト値はnullとして定義できます。 null値は、値自体を追加せずに値用のスペースを保持します。

hello.php
<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    echo $greeting." ".$name.$punctuation;
}
hello("Sammy");

変数は「宣言」されているため、関数の本体が変数にアクセスしようとしてもエラーは発生しませんが、変数は「設定されていない」と見なされるため、追加の出力は追加されません。

Output
Hello Sammy

戻り値

関数の出力を常に出力したいとは限らない場合があります。 関数の柔軟性を高めるために、最初に関数を呼び出したコードに出力値をreturnするのが一般的な方法です。 echoキーワードの代わりにキーワードreturnを使用します。

hello.php
<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    return $greeting." ".$name.$punctuation;
}
hello("Sammy");
echo hello("Sammy");

hello関数の最初の呼び出しでは、戻り値に対して何も行われないため、関数内のコードが実行されても、何も起こらなかったように見えます。 hello関数の2回目の呼び出しでは、関数呼び出しの前にキーワードechoが使用され、返された出力の結果を出力するようにPHPに指示します。

Output
Hello Sammy

結果を常に印刷する必要はありません。 これらの結果は、変数に格納したり、別の関数の入力として使用したりすることもできます。

関数内での関数の呼び出し

関数は再利用可能なコードのブロックです。 関数の外部で記述できるほとんどのコードは、関数の内部でも記述できます。 ただし、できるからといって、そうする必要があるとは限りません。 特定の非常に高度な場合を除いて、別の関数内で関数を定義しないでください。 ただし、多くの場合、別の関数内から1つの関数を呼び出します。 出力されるグリーティングの形式を指定するには、いくつかの組み込み関数を使用できます。

hello.php
<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

hello関数内の最初の行は、$nameの値にフォーマットを適用するようになりました。 まず、文字列を小文字に変換します。 strtolower関数は値を返し、その値はすぐに2番目の関数ucwordsで使用されます。 これにより、各単語の最初の文字が大文字に変換されます。 hello関数は、受け取った入力に関係なく、一貫してフォーマットされた出力を提供するようになりました。

Output
Hello Sammy

型宣言

PHPは緩く型付けされた言語です。つまり、与えられた値を状況ごとに適切な型に変換しようとします。 これにより、驚くべき、時には望ましくない結果が生じる可能性があります。 名前はstringである必要がありますが、代わりにintegerを渡すとどうなりますか。

hello.php
<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(123);

PHPは、整数123を文字列"123"に変換し、前と同じように関数を続行する型ジャグリングに問題はありません。

Output
Hello 123

これは有効な出力ですが、これもおそらく望ましい結果ではありません。 配列を渡すとどうなるか見てみましょう。 stringtolower関数は別のエラーをスローします。 このデモンストレーションの目的で、その行の先頭にダブルスラッシュを追加してコメントにし、そのコードの実行をスキップします。

hello.php
<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
    // $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(["Sammy", "World"]);

今回のコードは通知を提供しますが、それはあまり明確ではありません。 また、システムの設定方法によっては、通知がコードの実行を停止しないため、通知がオフになったり無視されたりする場合があります。 問題があることに気付かない場合や、問題が発生している場所を特定するのに問題がある場合があります。 出力は、文字列「Array」が関数に渡されたかのように見えます。

Output
Notice: Array to string conversion in php shell code on line 2 Hello Array

開発者は実際にコードを書くよりもはるかに多くの時間を読み取りとデバッグに費やします。そのため、私たちが書くコードを読み取りとデバッグの両方で可能な限り簡単にすることで、長期的には時間を節約できます。 PHP 5以降、PHP 7でのより強力なサポートにより、関数の入力と出力の両方の許容可能な値型を宣言または指定できるようになりました。

パラメータタイプの宣言

パラメーター型の宣言は、関数が呼び出されるときに使用される引数の値が、指定された型と一致することを確認します。 それ以外の場合は、TypeErrorがスローされます。 文字列型を$nameパラメータに追加して、array引数を再試行してみましょう。 今回は、stringtolower行を保持できます。これは、そのコードに到達しないためです。

hello.php
<?php
function hello(string $name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(["Sammy", "World"]);

今回は関数呼び出しによって例外が発生し、コードの実行が停止するため、有効な出力が得られません。 メッセージは、エラーが実際に何であるかについてもより明確です。

Output
Warning: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, array given

引数が配列ではなく整数に戻された場合、パラメーターは文字列値のみを受け入れる必要があるため、エラーが発生する可能性があります。 やるだけやってみよう:

hello.php
<?php
function hello(string $name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(123);

エラーをスローする代わりに、もう一度integerが問題なくstringに変換され、関数が実行されます。

Output
Hello 123

これは、PHPが緩く型付けされた言語であることに関係しています。 PHPは、整数に対して型ジャグリングを実行して文字列に変換し、実行を続行します。

厳密なタイプ

PHPが「型ジャグリング」を実行しないようにすることは、コードを読みやすく、デバッグしやすくするのに役立ちます。 PHPは、ファイルごとに厳密な型を宣言する方法を提供します。 厳密な型指定を強制する必要があるファイルの先頭に宣言を追加します。

hello.php
<?php
declare(strict_types=1);
function hello(string $name, $greeting = "Hello", $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello(123);

ファイルの先頭に宣言行を追加した後、stringの代わりにintegerが渡されると、PHPはエラーを生成します。

Output
PHP Fatal error: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, int given.

注:インタラクティブシェルでは、strict_typesを宣言できません。

Nullable型

hello関数の2番目のパラメーターを文字列として宣言することもできます。 デフォルト値であるため、引数は必要ありませんが、引数を渡す場合は、stringタイプである必要があります。 3番目のパラメーターもデフォルト値の文字列です。 null値は、この関数でも機能します。

hello.php
<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", string $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY", "Hola", null);

3番目のパラメーターのデフォルト値はnullに設定されているため、nullの引数と文字列を使用できます。

Output
Hola Sammy

ただし、パラメータのデフォルト値が文字列として宣言されている場合、null値は受け入れられなくなります。

hello.php
<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", string $punctuation = "!") {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY", "Hola", null);

代わりに、TypeErrorが与えられます:

Output
Warning: Uncaught TypeError: hello(): Argument #3 ($punctuation) must be of type string, null given

パラメータのデフォルト値がnull以外のものであるが、nullも有効な入力である場合、PHPは、型宣言の前に疑問符を追加することにより、その関係を定義する追加の構文を提供します。

hello.php
<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = null) {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY", "Hola", null);

これで、関数はnullの3番目の引数を受け入れ、前に処理されたとおりに続行します。

Output
Hola Sammy!

疑問符プレフィックスは、文字列だけでなくすべての型宣言で機能し、デフォルト値(?int $ageなど)を必要としません。

戻り型の宣言

パラメータ型を宣言できるのと同じように、関数の戻り型も宣言できます。 関数の戻り型を宣言するには、関数定義の閉じ括弧の後に、型とともにコロンを追加します。

hello.php
<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): ?int {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

宣言された戻りタイプは整数またはnull値のいずれかであることに注意してください。 この宣言された型は戻り値と一致せず、例外がスローされます。

Output
Warning: Uncaught TypeError: hello(): Return value must be of type ?int, string returned

返されたstringタイプと一致するように、リターンタイプを更新してみましょう。

hello.php
<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

これにより、以前に見た出力が得られます。

Output
Hello Sammy!

戻り値なし

関数が、戻り値をもたらさないアクションを実行する場合があります。 var_dump関数はその一例です。 hello関数の最初のバージョンに戻ると、voidリターンタイプを追加できます。

hello.php
<?php
function hello(): void {
    echo "Hello World!";
}
$greeting = hello();
var_dump($greeting);

これは、関数が値を返さないことを宣言します。 関数が呼び出されて変数に適用されると、関数自体の中でechoキーワードが使用されるため、出力が表示されます。 $greeting変数でvar_dumpを使用すると、値が返されておらず、$greeting変数がnull値に設定されていることがわかります。

Output
Hello World! NULL

voidタイプは、値だけでなく変数自体を操作するときによく使用されます。 そのためには、スコープを理解する必要があります。

範囲

スコープは単なる専門用語ではありません。 これは、「何かが扱っている、または関連している領域または主題の範囲」を測定するすべてのものに適用されます。 たとえば、大西洋の範囲は、西の南北アメリカから東のアフリカとヨーロッパ、そして北の北極海から南のインド洋にまで及びます。 水が大西洋から取られてインド洋に投棄された場合、その水はインド洋の一部になり、大西洋に影響を与えることはなくなります。 大西洋の範囲は変わっていません。

プログラミングでは、スコープとは、さまざまなコードが相互にアクセスする方法を指します。 アプリケーションには、スコープのいくつかの異なる領域があります。 関数の目的で、ファイルのグローバルスコープ関数スコープの2つを調べます。

デフォルトでは、グローバルスコープのコードは、ファイルが認識している任意の関数を呼び出しできますが、グローバルスコープのコードは、データにアクセスするための関数に直接到達することはできません。 関数によって返される値に依存する必要があります。 デフォルトでは、関数スコープのコードはグローバルスコープからの入力を受け入れ、出力をグローバルスコープに返します。 関数スコープのコードは、グローバルスコープに直接到達しません。

PHPはこれら2つのスコープを別々のエンティティとして扱うため、変数が関数に渡されると、変数自体ではなく、変数の「値」が渡されます。 グローバル変数を設定して、これがコードにとって何を意味するかを見てみましょう。

hello.php
<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello($name);
echo $name;

文字列を直接渡す代わりに、文字列変数を渡すようになりました。 変数の値のみが使用されるため、変数は文字列を直接渡すのと同じように機能します。 関数内で$name変数の値を変更すると、関数内の$name変数のみが影響を受けます。 グローバルスコープの$name変数は、別の変数です。

Output
Hello Sammy! SAMMY

echo hello($name)の出力は、「Hello Sammy」です。これは、$name引数で指定された関数によって返される値であるためです。 関数が呼び出された後でも、$name変数の値はグローバルスコープで変更されないため、echo $name;の出力は「SAMMY」になります。これは、グローバル変数が「SAMMY」に設定されたままであるためです。 」。

グローバルスコープへのアクセス

グローバルスコープと関数スコープの大きな違いの1つは、関数がグローバルスコープに到達してデータを取得できるようにすることはできますが、グローバルスコープ内の関数から直接データを取得することはできないことです。 globalキーワードは、グローバルスコープに到達します。

hello.php
<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string $greeting = "Hello", ?string $punctuation = "!"): string {
    global $name;
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello();
echo $name;

変数$nameはグローバルスコープに設定されていますが、関数に値を渡す代わりに、関数の最初の行がグローバルスコープから変数を取得するために到達します。 globalキーワードは、変数の値だけでなく、変数自体も取得します。 関数内で行われたフォーマットは、変数のグローバルスコープに適用されます。これにより、関数外の変数の値も変更されます。

Output
Hello Sammy! Sammy

グローバル変数を使用することは、変数の値が変更される可能性のある場所を追跡することが難しいため、悪い習慣と見なされます。 変数を変更する必要がある場合は、変数への参照を渡すことをお勧めします。

参照による引数の受け渡し

PHPは引数を値として読み取ります。 文字列「SAMMY」を含む変数を渡すか、文字列自体を渡すかは関係ありません。 値のみが使用されます。 値を渡すことで、グローバルスコープと関数スコープが重複するのを防ぎます。 関数は値を返す可能性があるため、その値を使用して、引数としても使用される変数を別のスコープに設定できます。 このようにコードを記述することにより、変数の処理が元のスコープに明確に保持されます。 前の例では、一部の組み込み関数の戻り値と一致するように変数の値をオーバーライドすることにより、$name変数の値を変更しました。 ucwordsstrtolowerのフォーマットを詳しく見てみましょう。

$name = "SAMMY";
$name = ucwords(strtolower($name));
echo $name;

$nameのこの新しい値は、新しいフォーマットになりました。

Output
Sammy

関数は単一の値を返すしかできませんが、関数は複数の変数に影響を与える可能性があります。 これまでに作成した例では、hello関数複数の変数を使用しますが、グローバルスコープ内のそれらの変数の値は変更されません。 PHPは、値だけでなく変数自体への参照を渡すことにより、別のスコープの変数と直接対話する方法を提供します。 引数は、任意のパラメーターにアンパサンド(&)を追加することにより、参照によって渡されます。

hello.php
<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): void {
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello($name);
echo $name;

$name変数が参照によって渡されると、グローバルスコープ内のその変数の値が変更されます。 関数が呼び出された後、$nameはフォーマットを保持します。

Output
Hello Sammy! Sammy

参照を渡す場合、引数は変数でなければなりません。 値は受け入れられなくなりました:

hello.php
<?php
declare(strict_types=1);
function hello(string &$name, string $greeting = "Hello", ?string $punctuation = "!"): string {
    global $name;
    $name = ucwords(strtolower($name));
    return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");

参照する変数がないため、エラーが発生します。

Output
Warning: Uncaught Error: hello(): Argument #1 ($name) cannot be passed by reference

組み込み関数

PHPには、アプリケーションで一般的なタスクをいくつでも実行するために使用できる多くの組み込み関数も含まれています。 これらは、言語にあらかじめパッケージ化されている実際の関数です。 すべての関数と同様に、これらの組み込み関数では括弧を使用する必要があります。

組み込み関数の関数定義のドキュメントを読むと、型宣言を含む、私たちが作成したユーザー定義関数と非常によく似ています。

変数処理関数

変数処理関数は、変数のタイプや値などの詳細を提供します。 最も一般的な変数処理関数の1つは、var_dumpです。

hello.php
<?php
var_dump("Hello World!");

この関数は、タイプやサイズなど、指定された値の詳細を提供します。 文字列「HelloWorld!」 12文字が含まれています:

Output
string(12) "Hello World!"

PHPは、特定の型の変数の値を操作するための追加の関数も提供します。

文字列処理関数

PHPには、文字列を操作するための特定の関数が含まれています。 これらの関数のいくつかは、strlenなど、文字列に関する詳細を提供します。

echo strlen("How many characters are contained in this string?");

この関数は文字列引数を取り、指定された文字列の文字数の整数を返します。

Output
49

他の文字列関数は、文字列自体に対してアクションを実行します。 文字を追加、削除、変更したり、文字列全体を変換したりできます。 これは、explode関数の場合です。この関数は、関数に提供された分割文字に基づいて文字列を分割し、配列を返します。 アイテムのコンマ区切りリストを配列に変換するには、explode関数を次のように使用できます。

groceries.php
<?php
$groceries = explode(",", "Milk, bread, eggs,fish.");
var_dump($groceries);

この最初の引数であるコンマ","は、コンマ文字に達したときに新しい配列要素を追加するように関数に指示します。 2番目の引数は、配列を作成するときに使用する文字列です。 スペースは分割文字として使用され、結果の配列には返されません。 他のすべての文字は、この分割文字でグループ化された配列要素として返されます。 この場合、個々の食料品の配列を作成します。

Output
array(4) { [0]=> string(4) "Milk" [1]=> string(6) " bread" [2]=> string(5) " eggs" [3]=> string(5) "fish." }

各文字は、大文字と小文字、スペース、およびピリオドなどの特殊文字を含め、元の文字列とまったく同じように保持されます。 この関数は文字列を1文字だけでなく文字列で分割するため、コンマの後にスペース", "を付けるなど、より長い文字列を使用できます。

groceries.php
<?php
$groceries = explode(", ", "Milk, bread, eggs,fish.");
var_dump($groceries);

これにより、配列アイテムの最初にスペースができなくなりましたが、コンマのみがあり、コンマの後にスペースがないため、卵と魚は分離されませんでした。

Output
array(3) { [0]=> string(4) "Milk" [1]=> string(5) "bread" [2]=> string(10) "eggs,fish." }

ほとんどの課題と同様に、上記のスペースの問題には多くの解決策があります。 配列関数を使用した関数の威力を確認し始めながら、1つを見ていきます。

配列処理関数

配列関数は、要素の並べ替え、要素の検索、キーの返却、配列の結合、各アイテムの計算の実行など、配列に対してさまざまなアクションを実行します。

配列内のアイテムの数を取得するための組み込みのcount関数があります。

groceries.php
<?php
$groceries = explode(", ", "Milk, bread, eggs,fish.");
var_dump($groceries);
echo count($groceries);

count関数は、引数として配列を受け取り、項目の数を含む整数を返します。

Output
array(3) { [0]=> string(4) "Milk" [1]=> string(5) "bread" [2]=> string(10) "eggs,fish." } 3

これは、3の「カウント」が配列内のアイテムの数array(3)と一致することを示しています。 次に、配列関数を使用して、4つのアイテムすべてを含み、開始スペースを含まない食料品リストを作成する方法を見てみましょう。

groceries.php
<?php
$groceries = explode(",", "Milk, bread, eggs,fish.");
$groceries = array_map("trim", $groceries);
var_dump($groceries);
echo count($groceries);

まず、1行目のexplode関数は、スペースなしのコンマを使用します。 次に、array_mapという配列関数を使用するために2行目が追加されます。 この関数は、最初の引数として渡された関数を、2番目の引数として渡された配列内の各項目に適用します。 渡される関数は、ユーザー定義関数または組み込み関数にすることができます。 この場合、組み込みのtrim関数を使用します。この関数は、変数の最初と最後から空白を「トリミング」します。

Output
array(4) { [0]=> string(4) "Milk" [1]=> string(5) "bread" [2]=> string(4) "eggs" [3]=> string(5) "fish." } 4

explode関数は、食料品の文字列を配列に変換しましたが、食料品のリストが文字列またはリストとして出力する配列として開始された場合はどうなりますか? implode関数を使用して、配列を文字列に変換できます。

groceries.php
<?php
$groceries = array("milk", "bread", "eggs", "fish");
echo "Grocery List: " . implode(", ", $groceries);

$groceries変数が設定され(array言語構成を使用)、食料品の配列を作成します。 次の行は、文字列「Grocery List:」を、コンマとスペース", "で区切られた食料品の文字列と連結します。 カンマとスペースは、アイテム自体を区切るだけです。 文字列の最初または最後には追加されません。

Output
Grocery List: milk, bread, eggs, fish

一部の関数は、参照によって引数を受け入れることにより、元の配列自体に対してアクションを実行します。 これらの関数は、結果の値を返しません。 食料品リストを並べ替えるために、sort関数を使用して行を追加できます。

groceries.php
<?php
$groceries = array("milk", "bread", "eggs", "fish");
$sorted = sort($groceries);
var_dump($sorted);
var_dump($groceries);

sortは元の配列自体に適用され、sort関数は新しくソートされた配列の結果を返さないため、新しい$sorted変数に再割り当てされません。 代わりに、常にブール値trueを返します。 したがって、$sorted変数のブール値はtrueですが、元の$groceries配列は値のアルファベット順に並べ替えられています。

Output
bool(true) array(4) { [0]=> string(5) "bread" [1]=> string(4) "eggs" [2]=> string(4) "fish" [3]=> string(4) "milk" }

割り当ては私たちに利益をもたらさなかったので、行をソート自体のみに変更できます。

groceries.php
<?php
$groceries = array("milk", "bread", "eggs", "fish");
sort($groceries);
echo "Grocery List: " . implode(", ", $groceries);

これにより、配列を並べ替えられたリストとして返すことができます。

Output
Grocery List: bread, eggs, fish, milk

追加の組み込み関数

標準のPHPディストリビューションには1,000を超える組み込み関数があり、多くの一般的なプログラミングタスク用の関数を見つけることができます。 以前に見た関数タイプの他に、数学関数国際化関数、およびその他のその他の関数などの他のタイプがあります。 オプションで、追加の関数には、特定のPHP拡張機能またはPHPでコンパイルされたモジュールが必要です。 ユーザー定義関数を作成する前に、PHPに要件を満たす組み込み関数があるかどうかを確認してください。

言語構成

言語構造は組み込み関数に似ていますが、PHP言語にハードコードされています。 それらは関数のように見えるかもしれませんが、常に同じ構文または規則に従うとは限りません。 例として、echoキーワードは、括弧を必要としない言語構造です。

<?php
echo "Hello World!";
echo("Hello World!");

どちらも機能し、同じ結果を提供します。

Output
Hello World! Hello World!

言語構造は、言語の構築方法を構成し、重要な機能を提供します。 たとえば、存在しない変数にアクセスしようとすると、エラーが発生します。 アクセスする前に変数が存在するかどうかをテストするには、issetまたはemptyを参照する必要があります。

<?php
if (empty($username)) {
    echo "Guest";
}

emptyが通常の関数である場合、$username変数にアクセスしてemptyに渡そうとしているため、警告が表示されます。 ただし、emptyは言語構造であるため、これは警告をスローせずに機能します。

関数と間違えられる可能性のある言語構造の他の例は、array()list()、およびeach()です。 これらの言語構造は、組み込み関数とともに、多くの一般的なプログラミングタスクに対するソリューションを提供します。 これらのコンポーネントが十分でない場合、ユーザー定義関数は、プロジェクトの再利用可能なコードブロックを作成するためのツールを提供します。

結論

関数は、モジュール式で再利用可能なコードを記述するための強力な方法を提供します。 関数は、標準のPHPディストリビューション、またはPHPでコンパイルされた追加の拡張機能に由来する場合があります。 個々の開発者は、単一のプロジェクトの関数を作成したり、複数のプロジェクト間で関数を共有したりすることもできます。 複数のアイテムまたは場所に対して実行されるアクションが必要な場合、関数はツールです。

関数を理解するための優れた基盤ができたので、PHPが提供する多くの組み込み関数を見てみましょう。 言語で何ができるかを知るだけでなく、開発者が過去に直面した一般的な課題のいくつかと、それらがどのように解決されたかを示します。

PHPの詳細については、PHPシリーズのコーディング方法の残りの部分を確認してください。