PHPの基本的な文法と関数

# 概要
PHPについて学習中なので基本的な文法についてまとめました
とある教材の内容理解を深めるためにまとめたものになっています

対象読者：多言語を学習済みでPHPを新しく学習しようと考えている人

追記(*2020/5/6*)
echoについてご指摘をいただいたので内容修正しました。

# 変数
- `$hoge`のように変数名の前に`$`をつける
- 変数名は英文字またはアンダーバーで始める ex.) `$hoge` , `$_hoge`
- PHPは動的型付け言語なので型を明示する必要はない

- 変数宣言時に型宣言を行うこともできる ex.) `int $hoge`

この場合弱い型付けになるらしい
参考： [【PHP】PHPの型宣言は弱い型付け] (https://qiita.com/azukiazusa/items/0e6f94d88bfd70fb248c) by @azukiazusa

# 定数
`const HOGE="hogehoge";`のように宣言する

# 標準出力

## echo

- 標準出力は`echo`を使う

追記：※echoは関数ではなく言語構造らしい
言語構造とは？
参考：[【PHP超入門】式・文・構文・言語構造・制御構造について](https://qiita.com/7968/items/d739e926189e219273bd) by @7968 

```php
echo("hoge");
echo "hoge";
```
上記のでもどちらでも可

- web上で表示させるときにhtmlタグを使いたい場合は`echo "<div>　hoge </div>"`のように書く

- echoは改行を含まない標準出力なので改行したい場合は`\n`が必要
- html上で改行したい場合は`\n`ではなく`</br>`を使う
- `\n`を`</br>`に置換してくれる`nl2br()`という関数もある


</br>


- 文字列を連結させたい場合は`.`を使う

```php
echo "hoge" . "huga";//出力結果は hogehuga
```
以前はpython触ってたので`+`じゃない違和感がすごい

文字列内に変数を含めたい場合は以下のような記法も可

```php
$hoge="hogehoge";
echo "$hoge is {$hoge}.";//出力結果は $hoge is hogehoge.
```

- 変数の値がstring型じゃなくても出力される
phpが内部で暗黙の型変換を行ってくれているらしい

```php
$number=1;
echo $number;//出力結果は 1
```

文字列連結や変数を含む文字列も型変換を行ってくれるので可能

```php
$number=1;
echo "number is" . $number . ".";
echo "number is {$number}.";
//出力結果はどちらも number is 1.
```

## var_dump()関数

- 変数の型と値を出力する`var_dump()`関数もある

こちらは改行を含む標準出力

```php
var_dump(1); //int(1)
var_dump("1");//string(1) "1"
var_dump([1,2,3]);
/*
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
*/
```
文字列は`string(文字列長) "文字列"`という出力になる
配列の要素も確認できるのでデバッグの時とかに便利そう

## NULLの出力
`echo()`関数はNULLを空文字として出力する
NULLを文字列として出力したい場合は`var_dump()`関数を使う

# 配列と連想配列

##配列

- 配列の宣言は以下のどちらかの記法で行う

```php
$arr=[1,2,3]
$arr=array(1,2,3)
```
PHPの配列は可変長配列なので要素の追加と取り出しが可能

- `array_push()`関数：配列の末尾に要素を追加。要素追加後の配列長を返す。
- `array_pop()`関数：配列の末尾の要素を削除(要素がない場合は何もしない)。末尾の要素を返す(空配列の場合はnullを返す)

どちらも破壊的処理を行う(元の配列が変化する)関数
末尾への要素の追加は`$arr[]="hoge"`のような記法でもOK

- 配列の結合を行う場合は`array_merge()`関数を使う

参考：[【PHP】連想配列、配列への追加](https://qiita.com/kazu56/items/6947a0e4830eb556d575) by @kazu56

```php
$arr=[];
//要素の追加
$len=array_push($arr,1);//$arr=>[1] , $len=>1
$arr[]=2;               //$arr=>[1,2] 当然だが配列長が返ってくるわけではない

//array_pushは複数要素を追加することも可能
$len=array_push($arr,3,4,5)//$arr=>[1,2,3,4,5] , $len=>5

//配列の結合はarray_mergeを使う
//[...]でもarray(...)でもOK
$arr_second=array_merge([0,0,0],array(4,5,6));//$arr_second=>[0,0,0,4,5,6]

//要素の取り出し
//現状 $arr=>[1,2,3,4,5]
$last_val=array_pop($arr);//$arr=>[1,2,3,4] , $last_val=>5

$zero_len_arr=[];
$last_val=array_pop($zero_len_arr);//$zero_len_arr=>[], $last_val=>NULL
```
配列の先頭要素を追加したり取り出したりする`array_shift()` , `array_unshift()`関数もあるがこちらは計算量が`O(N)`なので基本的には使わない方がいいと思う
PHPの双方向リストは自前で実装しないといけないっぽそう

配列系の関数いろいろ

- `count()`関数：配列長を求める
- `array_sum()`関数：数列の総和を求める
- `implode(string, arr)`関数：配列の文字列を第一引数の区切り文字で結合

```php
$arr=[1,2,3]
echo count($arr);//出力結果は 3
echo array_sum($arr);//出力結果は 6
echo implode(",",$arr);//出力結果は 1,2,3
```
implodeも暗黙の型変換を行うので数値も文字列として結合してくれる

## 連想配列

- pythonやjs等は`{"hoge":"a","huga":"b"}`のように書くが、PHPでは配列と同様に`[]`で囲む

```php
$arr=["hoge"=>1,"huga"=>2];
var_dump($arr);
/*出力結果
array(2) {
  ["hoge"]=>
  int(1)
  ["huga"]=>
  int(2)
}
*/
```
感覚としては配列は連想配列のキーを省略したような扱い？
[公式ドキュメント](https://www.php.net/manual/ja/language.types.array.php)によると以下の通り。
> PHP においては添字配列と連想配列の間に違いはなく、配列型は 1 つだけで、 同じ配列で整数のインデックスと文字列のインデックスを同時に使えます

ちなみに公式ドキュメントには以下のような例もある

```php
$array = array(
         "a",
         "b",
    6 => "c",
         "d",
);
```
これはキーと値の対応が以下のようになるらしい

```
0=>"a"
1=>"b"
6=>"c"
7=>"d"
```
やめてくれよ...
別例でキーに文字列型とint型を混在させるものも含まれているが極力使わない方がいいだろう

各要素を取り出すときは後述するfor文を回してもいいが各要素を取り出す`foreach文も使える`

```php
$alphabets=["a","b","c","d"];
foreach($alphabets as $alphabet){
    echo $alphabet;//出力結果は abcd
}
```

keyも取り出したい場合は以下のように記述する

```php
$alphabets=["a","b","c","d"];
foreach($alphabets as $key=>$alphabet){
    echo $key ."=>". $alphabet . "," ;//出力結果は 0=>a,1=>b,2=>c,3=>d
}
```
# 条件分岐、繰り返し

- 型チェックを含む比較演算子`===`と`!==`が使える
- `if else, switch-case, for, while ユーザ関数`はC言語と大体同じ記法

一応書いとく

- if 文

```php5
if (条件1){
    処理1
}
else if (条件2){
    処理2
}
else{
    処理3
}
```

三項演算子も使える

```php5
$hoge= $number>100 ? "big":"small";
```

- switch文

```php5

switch($hoge){
    case 1:
        処理1
        break;
    case 2:
        処理2
        break;
    default:
        処理3
        break;
}
```
`switch-case`の比較は**型比較を行わない**。型も比較したい場合は以下のように記述する必要がある

```php5
switch($hoge){
    case $hoge===1:
        処理1
}
```

- for文

```php5
for($i=0; $i<10; $i++){
    echo $i;
}
```

- while文

```php
$i=0
while($i<10){
    echo $i;
    $i++;
}
```

- ユーザ関数

```php
function sum(a,b){
    return a+b;
}
$c=sum(1,2);
echo $c;//出力結果は 3
```

無名関数も使えるようだがuse構文が勉強できていないので今回は紹介しない
興味がある人は公式ドキュメントを参照してください
[無名関数(公式ドキュメント)](https://www.php.net/manual/ja/functions.anonymous.php)

# まとめ

以前はpython使っていたので変数名の頭に`$`をつけるのと文末に`;`をつけるのを無限回忘れるので辛い