連載
» 2018年10月09日 05時00分 公開

VS Codeでコードを書きながら、PHPの基礎構文を概観しよう.NET開発者のためのPHPアプリお手軽開発入門(2/2 ページ)

[かわさきしんじ,Insider.NET編集部]
前のページへ 1|2       

制御構造

 PHPでは、if文、while文、for文、foreach文など、読者の多くが他の言語でおなじみの制御構造が利用できる。以下で簡単に見ていこう。説明が必要なものはそれほど多くないはずだ。

if文/switch文

 PHPのif文の例を以下に示す。

$name = "baz";
if ($name == "foo") {
  echo "foo\n";
} elseif ($name == "bar") {
  echo "bar\n";
} elseif ($name == "baz") {
  echo "baz\n"
} else {
  echo "other\n";
}


PHPのif文

 CやC#ライクな記述だが、PHPでは「elseif」を使う(else ifとも記述は可能)。また、各節が複数の文からなる場合には波かっこで囲んで「グループ文」(C#のブロック)とするのも、CやC#と同様だ。

 switch文の例を以下に示す。

$name = "bar";
switch ($name) {
  case "foo":
    echo "foo\n";
    break;
  case "bar":
    echo "bar\n";
    break;
  case "baz":
    echo "baz\n";
    break;
  default:
    echo "other\n";
    break;
}


PHPのswitch文

 C#ではcase節のフォールスルーはcaseラベルが連続しているときにのみ可能だが、PHPではbreak文、continue文にぶつかるまではフォールスルーされることには注意しよう。また、PHPのswitch文は「ループ構造」と見なされるため、for文やwhile文の内部でswitch文を使っている場合、continue文を利用してループの先頭に移動しようとしたつもりでもswitch文の直下にある文が実行されることには注意が必要だ(後述。詳細は「continue」を参照されたい)。

while文/for文

 while文とfor文もCやC#と同様だ。以下に例を示す。

$counter = 1;
while ($counter <= 5) {
  echo "count: $counter\n";
  $counter += 1;
}

for ($i=1; $i <= 5; $i++) {
  echo "count: $i\n";
}


PHPのwhile文とfor文

 上の例を見ると分かるように、PHPではインクリメント演算子(++)も使用できるし、「+=」などの代入演算子も用意されている(これらについては一つ一つ紹介する必要はないだろう)。

 break文やcontinue文も使用できる。以下に例を示す。

for ($i=1; $i < 6; $i++) {
  switch ($i) {
    case 1:
      echo "one\n";
      break;
    case 3:
      echo "three\n";
      continue;
    default:
      echo $i."\n";
    break;
  }
  echo "outer switch\n";
}


ループ内でのswitch文でbreak文とcontinue文を利用している例

 上のコードはforループ内でswitch文を利用して、変数$iの値に応じて、出力を変更し、最後に「outer switch」を出力するようにしている。C#のコードでは以下に相当する処理を行おうとしているといえる。

for (int i = 1; i <= 5; i++)
{
  switch (i)
  {
    case 1:
      Console.WriteLine("one");
      break;
    case 3:
      Console.WriteLine("three");
      continue;
    default:
      Console.WriteLine(i);
      break;
  }
  Console.WriteLine("outer switch");
}

同様な振る舞いを想定したC#のコード

 PHPの方のコード例では、「case 3:」節でcontinue文を使っている点に注目しよう。いつものつもりだとこれはforループの先頭に処理を移すように思えるが、実際にこのコードを実行してみると、次のようになる。

continue文はswitch文を脱出する continue文はswitch文を脱出する

 「three」という出力の後に「outer switch」と出力されている。これは先ほども述べたように、「switch文がループ構造と見なされる」からであり、C#のコードと同様な結果を得るには、continue文にオプションの引数「2」を与える必要がある。

foreach文

 foreach文の例を示す。

$array = ["foo", "bar", "baz"];
foreach ($array as $item) {
  echo $item."\n";
}


PHPのforeach文

 配列は上のコード例のように、その要素を「[]」に囲んで定義できる。他の定義方法もあるが、これらについては以下で触れよう。foreach文はC#とは異なり、最初に配列を指定して、asに続いて、その要素を参照する変数を記述していく。

 上に示したのが、いわゆる「配列」を反復処理するための構文だ。PHPのforeach文では連想配列を処理することも可能だ。以下に連想配列を定義して、これをforeach文で処理する例を示す。

$assocarray = [
  "one" => "foo",
  "two" => "bar",
  "three" => "baz"
];
foreach ($assocarray as $key => $value) {
  echo "$key: $value\n";
}


foreach文で連想配列を処理

 上のコード例の通り、連想配列は「[]」内に「キー => 値」の組みをカンマで区切って記述することで定義できる。これをforeach文で処理するには、asの後ろに「$キーを受け取る変数 => $値を受け取る変数」という形式で記述する。

 なお、PHPでは配列はarray関数でも定義できる。以下に例を示す。

# 1次元配列
$array2 = array(
  "foo",
  "bar",
  "baz"
);

// 連想配列
$array2 = array(
  "foo",
  "bar",
  "baz"
);


array関数による配列の定義
余談だが、1行コメントを記述するには「//」と「#」が使える。

 なお、連想配列のキーに指定できるのは整数か文字列だが、他の型の値(浮動小数点数や論理値)を指定した場合は、それらが適宜整数か文字列に変換される。ただし、配列のキーに配列やオブジェクトを指定することはできない。

 この他にもdo-while文、goto文などがあるが、これらについては省略する。

関数

 PHPの関数はfunctionキーワードを使って定義する。以下に例を示す。

function myfunc($arg1, $arg2) {
  return $arg1." ".$arg2;
}


パラメーターに2つの値を受け取り、それを文字列として連結したものを返送する関数myfuncの定義

 型指定がないのを除けば、すぐに何をしているのか分かるはずだ。PHPは動的型付け言語であるため、パラメーターや戻り値型は省略可能だ。ただし、「型宣言」と呼ばれる機能を利用して、関数のパラメーターや戻り値の型を指定することも可能だ。PHP 7以降では「スカラー型宣言」として、スカラー型(文字列、整数、浮動小数点数、論理値)の各型も指定可能となっている)。以下に例を示す。

function myfunc2(string $arg1, string $arg2): string {
  return $arg1." ".$arg2;
}


パラメーターと戻り値の型を指定した関数myfunc2の定義

 ただし、上記のように型指定を行っても、デフォルトでは型指定と異なる型の値を渡された場合でも、可能な限りの型変換が行われる。以下に例を示す。

<?php
function myfunc($arg1, $arg2) {
  echo gettype($arg1)."\n";
  return $arg1." ".$arg2;
}

function myfunc2(string $arg1, string $arg2): string {
  echo gettype($arg1)."\n";
  return $arg1." ".$arg2;
}

echo myfunc(1, 2), "\n";
echo myfunc2(1, 2), "\n";


パラメーター$arg1の型を調べるコードを追加した関数myfunc/myfunc2とそれらの呼び出し

 上のコードをCode Runner拡張機能を使って実行した結果を以下に示す。

関数myfunc2ではパラメーターに渡した整数が文字列に変換されている 関数myfunc2ではパラメーターに渡した整数が文字列に変換されている

 関数myfunc/myfunc2の呼び出しではどちらも整数を引数として渡している。これに対して、関数myfuncはそれを整数のまま受け取り、関数myfunc2では整数が文字列に変換されていることが分かる。より厳密に型チェックを行いたければ、「declare(strict_types=1);」を指定する。


 今回はPHPコードを読み書きするために必要最低限な知識として、Hello Worldサンプルを例に文字列の扱い方、制御構文、関数のほんの基礎を駆け足で説明した。次回はオブジェクト指向プログラミングに必要となる要素について、やはり駆け足で見ていこう。

「.NET開発者のためのPHPアプリお手軽開発入門」のインデックス

.NET開発者のためのPHPアプリお手軽開発入門

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。