PHPで最低限覚えておきたい基礎知識（言語リファレンス）


#はじめに
久しぶりにPHPの基礎文法についておさらいしたので、その内容を簡単にまとめた記事です。
結構なボリュームになりましたが、これからPHPを始める人の参考になれば嬉しいです。


もし間違っている点あれば、ご指摘いただけると幸いです。

#基本編
PHPでプログラムを動かす為の基本です。サクッと覚えちゃいましょう。

##Hello World
```php
<?php
echo "Hello World";
?>
```
まずは、おなじみのこれ。
PHPは、`<?php`と`?>`の間に書かれたものが、プログラムとして実行されます。プログラムの終わりには`;`を付けます。

##コメント
```php
#1行コメント
//1行コメント
/*複数行コメント
複数行コメント */
```
全部で3種類あります。`/*複数行コメント*/`を使う場合、同じ形でコメントアウトをネストするとエラーになるので注意です。

##文字列の出力
```php
echo "こんにちは"; //こんにちは
print "こんにちは"; //こんにちは
```
`echo`もしくは`print`でブラウザに文字列を出力できます。
この2つの違いは、次の3つです。基本は`echo`で問題ないかと思います。

<b>1. `echo`はカンマ「,」区切りで複数の文字列を指定できるのに対し、`print`は出来ない</b>

```php
echo "Hello", "World"; //この構文はエラーが出ません
print "Hello", "World"; //この構文はエラーが出ます
```

<b>2.`print`は結果を返すのに対し、`echo`は返さない</b>

```php
$str = echo "Hello World"; //この構文はエラーが出ます
$str = print "Hello World"; //この構文はエラーが出ません
```
※結果を返さない分、わずかにecho()の方が早いようです。


##文字列
```php
echo "文字列";
echo `文字列`;
```
文字列は`"ダブルクォーテーション"`か`'シングルクォーテーション'`で囲むことで、扱うことができます。
この2つの違いは、変数が展開できるか否かです。変数については、この後で触れてます。

```php
$str = "太郎";
echo "私の名前は、$str"; //私の名前は、太郎

$str = "太郎";
echo `私の名前は、$str`; //私の名前は、$str
```
##ヒアドキュメント
```php
echo <<<EOD
ヒアドキュメントを使えば、長い文章を簡単に出力することができます。
連結文字やダブルクオーテーション使わずに済みます。
EOD;

/*
ヒアドキュメントを使えば、長い文章を簡単に出力することができます。　
連結文字やダブルクオーテーション使わずに済みます。
*/
```
ヒアドキュメントは、`<<<開始ID 文字列 終端ID;`で使うことができます。

IDでよく使われるのが、「EOM」「EOF」「EOD」ですが、「ABC」でも何でも構いません。
ちなみに、「EOM」は End Of Message、「EOF」は End Of File、「EOD」は End Of Document の略です。

##改行
```php
<html>
<head>
<title>PHPの基礎知識をまとめてみた</title>
</head>
<body>
<?php
echo "1行目：改行して出力<br />";
echo "2行目：改行後の文字列";
?>
</body>
</html>

<?php
echo "1行目\n";
echo "2行目";
?>
```
ブラウザ上での改行は、`<br />`と`HTMLタグ`を入れます。ソース上での改行は、`\n`を入れます。

##文字列のエスケープ
```php:非文字列エスケープの例
echo "<a href="http://php.net/manual/ja/index.php">PHPマニュアル</a>";
//Parse error: parse error, expecting `','' or `';'' in
```
これたど、`echo "文字列"`の括りの中にさらに`"`が入っている為、エラーが出ます。
これを回避するには、エスケープ文字`\`を使います。エスケープ文字は重複する`"`の前に付けます。

```php:文字列エスケープの例
echo "<a href=\"http://php.net/manual/ja/index.php\">PHPマニュアル</a>";
//PHPマニュアル
```

#変数編

変数というのは値を保持しておく箱だと思って下さい。
値を保持しておいて後から計算に使ったり、取り出して表示したりすることができます。

##変数
```php
$num  = 1;
echo $num; //1

$str = "Hello World";
echo $str; //Hello World
```
変数は、`$変数名 = 値`で宣言します。ポイントは、変数の前に`$`を付けること。
ちなみにPHPでは型の定義を勝手にしてくれます。つまり、Javaみたいに型の定義を宣言する必要が無いです。

ただし、変数には[命名規則](http://php.net/manual/ja/language.variables.basics.php)があるので気を付けましょう。

##文字列と変数の結合

```php
$str = "文字列";
echo `私の名前は、`.$str; //私の名前は、太郎
```
文字列結合演算子`.`　を使うことで、文字列と変数を結合できます。

##変数の参照渡し
```php:非参照渡しの例
$a = 1;
$b = $a;

$a = 2;
echo $b; //1
```
PHPが`$a`と`$b`を違う変数として扱っているため、`$a`の値を変更しても`$b`の値は元の「1」を保持したままです。
これを参照渡しを使うことで、`$a`と`$b`を「違う名前を持つ同じ変数」として扱えるようにできます。
参照渡しを使うにはアンパサンド`&`を使います。`&`を代入する方の変数の`$`前に付けます。

```php:参照渡しの例
$a = 1;
$b = &$a; //アンパサンドを使う

$a = 2;
echo $b; //2
```

##変数のスコープ
※関数を理解していないと躓くと思うので、とりあえずこういうのがあるんだ程度で覚えといて下さい。

```php
function outputInfo($name){
$pet = "猫"; //ローカルスコープ
echo $name."さんは".$pet."を飼っています”
}

outputInfo("山田");
echo $pet."は可愛いですね";
```
```php:出力結果
//山田さんは猫を飼っています
//undefined~ は可愛いですね
```


変数の使える範囲を`スコープ`と言います。
P関数内で作成した変数は、ローカルスコープと呼ばれ、その関数内でしか参照できません。

ローカル変数をグローバルスコープでも使えるようにするためには、グローバル宣言をする必要があります。
グローバル宣言は`global 変数名;`で宣言することができます。

```php
function outputInfo($name){
global $pet;
$pet = "猫"; 
echo $name."さんは".$pet."を飼っています”
}

outputInfo("山田");
echo $pet."は可愛いですね";
```

```php:出力結果
// 山田さんは猫を飼っています
// 猫は可愛いですね
```

#定数編
定数というのは、変数に対して変更してはいけない値を保持しておくものです。消費税とか円周率とか。

##定数
```php
define(`PI`, 3.14);
echo PI;  //3.14
```
定数は、`define`で宣言します。変数と違って`$`を付ける必要はありません。
慣習的に、定数は常に大文字で表記されます。

ちなみに、定数のスコープはグローバルなので、PHPスクリプト中どこでも定数にアクセスできます。

#演算子編

演算子というのは、プログラミングで計算や判定をしたりするのに使われる記号のことです。

##算術演算子
```php
$a + $b         // 加算
$a - $b         // 減算
$a * $b         // 乗算
$a / $b         // 除算
$a % $b         // $a を $b で割った余り
```

小学校で習った算数と同じですね。数値を足したり引いたりするための演算子です。

##加算子（インクリメント）/減算子（デクリメント)
```php
$a++            // $a の値をひとつ加算する(変数を返し、変数に+1を加えます。)
$a--            // $a の値をひとつ減算する(変数を返し、変数から-1を引きます。)
++$a            // $a の値をひとつ加算する(変数に+1を加え、変数を返します)
--$a            // $a の値をひとつ減算する(変数から-1を引き、変数を返します)
```
数の値を「+1」「-1」にする演算子です。インクリメント演算子とデクリメント演算子と言います。
インクリメント/デクリメント演算子を変数の前/後に付けた場合で挙動が異なるので、注意しましょう。

##文字列演算子
```php
$a . $b         // 文字列 $a と文字列 $b を連結
```

文字列を結合する演算子です。連結したい文字列や変数の間にドット「.」を挟みます。

##代入演算子
```php
$a = $b         // 代入
$a += $b        // $a = $a + $b に同じ
$a -= $b        // $a = $a - $b に同じ
$a *= $b        // $a = $a * $b に同じ
$a /= $b        // $a = $a / $b に同じ
$a %= $b        // $a = $a % $b に同じ
$a &= $b        // $a = $a & $b に同じ
$a |= $b        // $a = $a | $b に同じ
$a ^= $b        // $a = $a ^ $b に同じ
$a <<= $b       // $a = $a << $b に同じ
$a >>= $b       // $a = $a >> $b に同じ
$a .= $b        // $a = $a . $b に同じ
```
変数に値を代入する演算子です。

##比較演算子
```php
$a == $b        // $a と $b が等しい
$a === $b       // $a と $b が等しい(型を厳密に比較する)
$a != $b        // $a と $b が等しくない
$a <> $b        // $a と $b が等しくない
$a !== $b       // $a と $b が等しくない(型を厳密に比較する)
$a < $b         // $a が $b よりも小さい
$a > $b         // $a が $b よりも大きい
$a <= $b        // $a が $b 以下である
$a >= $b        // $a が $b 以上である
```
後で出てきますが、if、for、while の条件分岐に利用する演算子です。

##論理演算子
```php
$a and $b       // $a かつ $b が TRUE であれば
$a && $b        // $a かつ $b が TRUE であれば
$a or $b        // $a または $b が TRUE であれば
$a || $b        // $a または $b が TRUE であれば
!$a             // $a が FALSE であれば
$a xor $b       // $a まはた $b どちらか片方のみが TRUE であれば
```

論理演算を行うための演算子です。

#配列編
配列というのは、複数の値を入れられる箱だと思って下さい。
変数は１度に１つの値しか保持できませんが、配列を使えば１つの変数に複数の異なる値を保持する事ができます。

##配列
```php
$family = ['dad', 'mom', 'son', 'daughter']; // $familyは配列
echo $family[0]; //dad
echo $family[1]; //mom
echo $family[2]; //son
echo $family[3]; //daughter
```
変数では1つの変数に1つの値しか保持（代入）する事ができませんが、配列を使えば１つの変数に複数の値を保持する事ができます。
配列は、`array[値1,値2,...]`で使うことが出来ます。

##連想配列
```php
$family_name = [
    'dad' => 'taro',
    'mom' => 'hanako',
    'son' => 'saburo',
    'daughter' => 'siro'
];

echo $family_name['dad']; // 'taro'
```
配列では、[ ]の中は、0,１,2...の数字の順番でしたが、数字ではなく文字のキーをもとにして値を設定した配列を連想配列と呼びます。
連想配列は、`配列名 = array[キー1 => 値1, キー2 => 値2, ... ];`で使うことができます。

#制御構造編
上から順番に処理していく単純なプログラムではなく、条件によって処理内容を変更したり、同じ文を何回も実行したりする事、つまりプログラムの流れを制御するものを制御構造と言います。

##条件分岐（if文）
```php:条件分岐
$num = 5;

if ($num > 3) {
  echo "変数numの内容は3より大きいです"; //条件に一致した場合に実行する処理
} else {
  echo "変数numの内容は3より小さいです"; //条件に一致しなかった場合に実行する処理
}

// 変数numの内容は3より大きいです
````

条件式の部分がTRUEであれば処理を実行し、FALSEであれば実行せずに無視します。

```php:条件の複数指定
$num = 5;
if (num == 10) {
  echo "変数numの内容は5です。";
} elseif ($num > 2) {
  echo "変数numの内容は2より大きいです。";
} else {
  echo "変数numの内容は2より小さいです。";
}
```

条件を複数指定したい場合は、`elseif`を使います。

```php:真偽値の判定
$num = TRUE;

if ($num === TRUE) {
  echo "変数numの内容は真です。"; //条件に一致した場合に実行する処理
}
if ($num === FALSE) {
  echo "変数numの内容は偽です。"; //条件に一致しなかった場合に実行する処理
}
```
上記のように、`TRUE`と`FALSE`を判定することもできます。

```php:AND条件とOR条件
$num_a = 2;
$num_b = 4;

if ($num_a == 2 and $num_b == 4) {
  echo " 変数num_aは2、変数num_bは4です。"; //条件に一致した場合に実行する処理
} else {
  echo " 条件に一致しません。"; //条件に一致しなかった場合に実行する処理
}
```

数の条件を組み合わせて1つの条件にすることもできます。


##Switch文

```php
$i = 1;
switch ($i) {  //{}は繰り返し行う処理
    case 0:
        echo "iは0に等しい"; //実行する処理1
        break;
    case 1:
        echo "iは1に等しい"; //実行する処理2
        break;
    case 2:
        echo "iは2に等しい"; //実行する処理3
        break;
}
```

`break;`で処理から抜けることができます。もし`break;`が無い場合、case 0:つまり、`$i`が0に等しい場合は、全てのecho文を出力してしまいます。`$i`が１の場合、最後の2つのecho文を出力してしまうので注意です。

##ループ処理(while文）

```php:通常のwhile文
$i = 1;
while( $i <= 10 ){ //iが10を超えると処理を終了する
  echo $i++."<br />\n"; 
}
//1から１０まで改行されて出力される
```

while文は、条件式の値がTRUEの間ループ処理を実行しつづけます。条件式が初めからFALSEの時はループ処理は一回も実行されません。

```php:do-while文
$i = 1;
do{
  echo $i++."<br />\n"; //繰り返し判定を行う前に一度処理が実行される
}
while( $i >= 10 ); 
//１
```
while文は、条件式が初めからFALSEの時はループ処理は一回も実行されませんが、必ず1回は処理を行う場合にはdo..while文を使うことができます。

##ループ処理（for文）
```php
for( $i = 1; $i<= 10; $i++ ){
  echo $i."<br />\n"; //改行しながら値を表示
}
//1から１０まで改行されて出力される
```

for分は、「条件式」の値がTRUEの場合、ループ処理を実行しつづけます。「条件式」がFALSEの時はループ処理の実行を終了します。


While文とfor文で同じような処理が行えますが、使い分けるポイントは[こちら](https://zeropuro.com/blog/?p=245)の記事が参考になりました。

- `繰り返す回数があらかじめわかっている ⇒ for`
- `繰り返す回数があらかじめわからない ⇒ while`

##ループ処理（foreach文）
```php:
$family_name = [
    'dad' => 'taro',
    'mom' => 'hanako',
    'son' => 'saburo',
    'daughter' => 'siro'
];

foreach($family_name as $value){ //$family_nameを$valueに代入
    echo $value;
} 
///tarohanakosaburosiro
```

foreach文は配列用のループ処理です。要素数が多い配列や、データベースにある大量の情報を順に取り出したい時に使えます。

##continue文
```php
$family = ['dad', 'mom', 'son', 'daughter']; // $familyは配列

foreach ($family as $value){
    if($value == "mom"){
        continue;
    }else{
        echo $value;
    }
    }
//dadsondaughter
```

continue文を使うと、ループ構造の中で現在のループ処理をスキップし、次のループから処理を続けることができます。


これらのループ処理はイメージで理解すると分かり易いかと思います。[こちら](https://www.sejuku.net/blog/23326#continue)が参考になりました。