PHP 基礎文法

## \<?php ~ ?>

- HTMLの中にPHPを埋め込む
- ファイル内に複数記入可能

## echo

- 引数を結合して文字列を表示
- 改行文字がなければ当然改行されない

## 大文字と小文字の区別

- echo、if、whileなどPHPのキーワードや、ユーザー定義関数やクラス名：大文字だろうが小文字だろうがどっちでもいい
- ユーザー定義の変数名や定数名：文字が完全一致していなければ別物

## コメント /* ~ */,// ~

- // ~ ：１行のみコメントアウト
- /* ~ */ :複数行コメントアウトできる。コードの途中に挟むのも可能。

## 空白と改行

無視される

## 数字が含まれてる文字列を使った計算

- 例： 2+"15"のように数値と数値文字列を足すと数値同士の計算に変換される
- 例："250円"*2のように数値以外の文字があっても数値同士の計算、つまり250*2に変換される

## インクリメント

- 例：$b=++$a; の場合、加算（＋１）→代入の順に処理される。つまり$bの値と$aの値は等しくなる

## ポストインクリメントとポストデクリメント

- 例：$b=$a++; の場合、代入→加算（＋１）の順に処理される。つまり$bの値と$aの値は等しくならない

## 文字列のインクリメント・デクリメント

- 数値文字列は数値と同じだと見なされ、＋１される。
- アルファベットは加算されるのではなく、順番が進む。"a"→"b"になる。

## 文字列結合演算子

- 文字列を結合するためには、ピリオドが使われる。ピリオドが演算子になる。
- 例：文字列 . 文字列 . 文字列　

## 数値の連結

- 数値をピリオドで連結すると、数値が文字列に変換される。

## PHP_EOL

- 各OSの改行文字。改行文字は環境ごとに変わるが、PHP_EOLを打つだけで環境ごとの改行文字を取得できる
- 定数

## 比較演算子

- 例：$a < $b → true／falseどちらかの値に置き換わる

### 緩やかな比較 ==、!=

- 記号が二つだと緩やかな比較。==の場合、値が同じならtrue,異なるならfalse。
- 数値文字列と数値は値が同じ、ということになっている。"99"と99は同じ値になる。

### 厳密な比較 ===、!==

- 記号が３つだと厳密な比較。===の場合、値と型の両方が同じならtrue,異なるならfalse。
- "99"と99は同じ値だが、型が異なるから、===の場合、false

## 論理演算子

- 例：&&、and、||、or、!など
- 論理積は「かつ」、論理和は「または」、排他的論理和は「どちらか片方」、否定は「ではない」
- &&とand、||とorは、書き方が違うだけで働きは同じ。
- $hantei = ($test1 and $test2)のように、論理式をカッコでくくろう。$hantei = $test1 and $test2 の場合、代入が先に行われてしまう。

## 三項演算子

- 例：A ? B : C 　AがtrueならBが返る。falseならCが返る。

## 宇宙船演算子 <=>

- 左項と右項の大きさを比較する
- 左が右より大きいなら1、等しいなら0、左が右より小さいなら-1が返る。

## NULL

- 変数に値が入ってないと、NULLが入る。
- NULLの場合にそのまま利用するとエラーの原因になる。

### NULL合体演算子

- 例：A ?? B　AがNULLならBが返る。

### ??= NULL合体代入演算子

- +=みたいなもの。$a = ($a + 1)の式を$a += 1と書けるように、$a = ($a ?? 1)の式は$a ??= 1と書ける。つまり、$aがNULLの時に$aに1を代入して初期化できる。

## ビット演算子

### ビットシフト
- ビットシフトとは指定した方向に桁をシフトする演算。10進数の数値を左へ１桁シフトすると値が10倍になるように、(例：5→50)、2真数の値を左へ1桁シフトすると値が2倍になる。(例：1→10)
- 演算子は<<,>>
- a<<bをするとaを左へb桁シフトする。

### ビット積・ビット和・排他的ビット和・ビット否定

- 数値を２進形式にして各桁のビットごとに比較
- 演算子は&(ビット積),|（ビット和）,^（排他的ビット和）,~（ビット否定）
- ビット積だと、各桁同士を比較し、両方が１ならば１、そうでなければ0　例：1010 & 0001 → 0000 

## キャスト演算子

- 例：(int)、(bool)など
- PHPでは変数に型宣言が必要ない。$a='10'とすると、$aは型がstringで値は'10'。$b=(int)$aとすると、$bは型がintegerで値は10になる。（$aはStringのまま）

## 型演算子 instanceof

- A instanceof クラス名　：　Aが右のクラスのインスタンスの場合true、そうでなければfalseになる。

## 演算子の優先順位

- (5 + 3 * 2)の式では先に3 * 2の演算が行われるように、演算子*は演算子+より先に実行される。
- 実行順がよくわからないしきは、()で演算子きをくくると間違いが防げる

## 条件式

- if ((A>B) && (C>D))のように、各論理式をかっこで囲む。

### 条件によってHTMLコードを出し分ける場合

- 条件式の特徴は全部のコードを実行しないということ。条件式の結果によって一部のコードのみ実行する。
- if文やelseif文を逐一<?php ?>というphpの呪文で囲む。つまりphpの呪文を複数書くことになる。
- <?php if A ?>と書くと、Aがtrueなら<?php if A ?>から<?php else if ~ ?>の範囲のみ実行される。

## switch文

- 例えばレストランでの会計のプログラムを書くとする。$foodの変数の値が"ramen"なら$priceの変数に800を代入したい。このように、変数の値の内容に応じて処理を変えたい場合、case "ramen": $price =800;のように、商品の数だけ処理を書く必要がある。その上、全部のプログラムを実行する必要はない。case ramen:以下だけ実行されれば良い。こういう場合はswithc文を使う。
- 各分岐は最後にbreak;と書く。if文のように途中で脱出しないから、明示的に書いて脱出させる。
- break;を書かない手もある。パターンAとパターンBで同じ処理をさせたい場合もあるからだ。パターンAの分岐でbreakを書かないとその下のパターンBに処理に移り、ここでAとBの共通処理を書けば良い。
- どのパターンにも属さない、いわゆる「その他」の処理はcaseの代わりにdefaultを書く。必ず書く必要はない。

## match式

- 例えば絵の具屋のプログラムを書くとする。$colorNumberの値が0なら$colorNameに"青"を代入したい。このように、変数の値の内容に応じて処理を変えたい場合、0 => "青"のようにすると、"青"が取得できる。後は$colorName = match()のようにしてmatch式から"青"が返って来て変数に代入できる。
- defaultキーワードがある。

### match式とswitch文との違い

- switch文は緩やかな比較、match式は厳密な比較を行う。

## ループ

- 永遠にループさせるのも可能、変数をインクリメントなどしてループを抜けるのも可能
- while(TRUE)とすると、永遠にループする。抜けたい場合ifとbreakを使う

### while文

- ループさせるか、つまりwhile文を実行するか、最初に判断する。

### do-while文

- ループさせるか、つまりwhile文を実行するか、１回目のループ後に判断する

### for文

- ループ回数を固定させるか、つまりi<10とかして１０回に決める。または、i<maxみたいに変数の値に応じてループ回数を変動させる。
- ネストさせるとAABAABみたいな処理を簡潔にかける。
- breakはコードを終了させるが、for文内だとfor文のみ終了させる。ネストされたfor文内だとネストされたfor文のみ終了させる。
- breakは繰り返しを中断する
- continueは１回目、２回目、３回目、の２回目だけスキッさせることができる

## round
- 数値を丸める。123.456を123.4にするなど、数を削れる。
- 1.5は2に、-1.5は-2に、など削り方にいくつかパターンがあり、指定できる。基本4捨5入。デフォルトあり。
- 削る桁数を指定できる。デフォルトあり。

## ユーザ定義関数
- 引数に型を指定できる。integerにfloatの値を渡すとintegerに強制的に変換される
- 戻り値にも型を指定する
- 文法はfunction〜
- return文で結果を返す
- 共通の目的の処理を１つにまとめる
- 何も返さないreturn文で中断できる

### 引数の個数を固定しない

- ...$membersのようにすると、引数の数はいくらでもOKになる。
- team("佐藤", "田中", "加藤");とすると、$members配列に引数がまとめて入ってくる。

### デフォルト引数

- 引数にデフォルト値を設定できる。つまり入力せずとも引数に値が入る。

### 名前付き引数

- 引数の数が増えるほど順番に気をつけるのが大変になる。
- 呼び出し側で引数を指定できるため順番を無視できる
- 呼び出し側を読むだけで関数の中身が想像できる

### 引数と戻り値の型指定

- 必須ではない。
- 戻り値がない関数では:voidと書ける

### 引数と戻り値に複数の型を指定する

- Union型という。null型も指定可能。
- どのような値でも良い場合はmixed型
- Union,mixedはPHP8からの新機能

## 変数のスコープ

- 変数が有効な範囲のこと。

### ローカルスコープとグローバルスコープ

- どこでも使えるのがグローバルスコープの変数
- 関数内、for文ないだけでしか使えないのがローカルスコープの変数

### グローバル変数

- global 変数名; で変数をグローバルスコープにしますよ、と宣言できる。つまり特定の関数内でグローバル変数が使えるようになる

### スタティック変数

- static 変数名 = 0; とすると、何度も初期化しなくて良くなる。繰り返して関数を呼び出しても、最初の１回しか初期化されなくなる。

## implode

- joinのように、配列と区切り文字を引数に取る。
- 配列の要素を全て取り出して文字列にし、区切り文字で区切る。

## ダブルクォーとで囲まれた文字列

- PHPで基本文字列内に変数を書くと変数の値が文字に置き換わる。
- {変数}と書くのもOK

### ダブルクォーとの文字列で使えるエスケープシーケンス

- $は文字ではなく特別な役割を持っている。変数だよーってことを表す接頭辞。
- \$と書くと、$記号を文字として使える。

## シングルクォーとで囲まれた文字列

- $変数名が特別な役割を失う。ただの文字になる。
- シングルクォーとをただの文字にしたい場合、\をつける。

## ヒアドキュメント構文

こんにちは。
ありがとう。

- ↑みたいにごく普通に書いた文章を変数に格納できる。改行もされている。
- ダブルクォーとを使うので変数展開できる。

## Nowdoc構文

- シングルクォーとを使うので変数展開できない。

## 数値として扱われる数値文字列

- 数値文字列は数値として計算できる
- 前後に半角スペースがあってもOK
- 数値の後ろに文字があってもOK

## フォーマットされた文字列を表示する printf()

- 小数点第2位まで表示するなど、表示の仕方を操作できる
- フォーマット文字列と値を引数とする
- %の位置に置き換わる。複数OK。前の値から順に%の位置に入っていく。
- フォーマット文字列の構文 '... % 値番号 書式修飾子 型指定子 ...'

### %と置き換わる値を値番号で指定する

- ↑のやり方だと、値が多くなるにつれて、%と値を置き換えるのが大変になることがある。%1$,%2$とすると%と値の紐付けが簡単になる。

### 書式修飾子

- %,%1$,の次は複数の値を連結させる。
- 値にどんな文字を幾つつけるか、そんなことを指定できる

#### 符号指定子
- +だと、+をつけて表示できる。
- 型指定子と言って、値の型を指定する。

#### パディング指定子
- 文字数うと足りない文字を指定できる

#### アラインメント指定子
- 値を左寄せにするか右寄せにするかを指定する

#### 幅指定子

-　置換後に何文字にするか指定する。

#### 型指定子

- 痴漢する値の型を指定する

## フォーマットされた文字列を返す関数 sprintf()

- printfに戻り値が付いたやつ

## 痴漢する値を配列で指定する vprintf, psprintf

## 数値の３桁区切り number_format()

## 文字数を調べる mb_strlen

## 文字列から文字を取り出す mb_substr

## 半角英数文字だけの文字列

### 文字数を調べるstrlen

### 文字列から文字を取り出す substr

## 全角と半角の変換、ひらがなとカタカナの変換 mb_convert_kana

- 色んなモードがあるが、"as"とすれば全角の英数記号と空白をそれぞれ半角にしてくれる。

## 英文字の大文字／小文字の変換

- 半角の英文字はstrtoupperで小文字を大文字に変換できる
- 半角の英文字はstrtolowerで大文字を小文字に変換できる

## 単語の先頭文字だけ大文字にする

- ucfirst()は英文の先頭の文字だけを大文字にする
- ucworlds()は英文に含まれているすべての単語の先頭の文字をそれぞれ大文字にする。

## 不要な空白や改行を取り除く 

- trimが先頭と末尾両方
- ltrimが先頭のみ
- rtrimが末尾のみ

## HTMLタグ用のエンティティ変換（HTMLエスケープ）

- フォームから入力された文字に<や＞などのHTMLタグに含まれている記号文字が混ざっているとき、その内容をそのまま使ってページ表示すると表示が崩れてしまう。
- そのため、危険な記号もじは安全な文字列に置き換える。この文字列をエンティティと呼ぶ。htmlspecialcharsを使う。
- HTMLコードにはエンティティが含まれていて、ブラウザがエンティティを元々の文字に変換して表示うする。
- エンティティに変換するのではなくHTMLタグを取り除くこともできる。strip_tagsを使う

## URLエンコード

- URLに空白やマルチバイト文字(半角英数字では表せない文字列)が含まれている場合に、URLエンコードを行う。
- URLにはプロトコルやファイル名などが含まれ、全ての文字列を受け付けるわけではないので、ゴミを除去する場合が出てくる。
- rawurlencode, urlencodeの２種類の関数がある.。亮hさの違いは空白文字の扱いです
- rawurlencodeは空白文字を%20に変換し
- urlencodeは+に変換する。

## 数値と数値文字列を比較する

- 数値と文字列を ==演算子で比較する時、数値文字列は数値に直されて比較される。
- 数値と比較する文字列が純粋な数値文字列でない時は、PHP8では数値を文字列に変換して比較する。

## 文字列を比較する関数 strcmp

- 左が右より小さい時負の値、等しい時０、左が右より大きい時正の値を返す。

## 大文字と小文字を区別せずに比較する関数 strncasecmp

## 前方一致で比較する関数　strncmp

## 文字列を検索する

- strposは、検索して最初に見つかった位置を返す。

## 文字列が含まれている個数を調べる mb_substr_count

- 検索した文字列が何個含まれているかを返す

## 見つかった位置から後ろの文字列を取り出す mb_strisstr

- 特定の文字を検索して最初に見つかった位置から後ろにある文字列を取り出す

## 検索して置換する str_replace

- 検索して、見つかったら指定の文字で置き換える。

## 置換した個数を調べる str_replace

- 検索して、見つかったら指定の文字で置き換え、引数として渡した変数に個数が入る。
- 配列で複数の文字を検索することも可能

## 正規表現

- preg_matchはパターンにマッチしたら1を返し、マッチしなかったら0を返し、パターン式が間違ってたらfalseを返す。
- 4?-49のように、調べたい一部の文字が不明な場合、何でも良い1文字を表す文字が欲しい。それが . です。


### 任意の1文字が6~9の数字のパターン

- "/4[6-9]-49/u"とする。
- この複数の文字のうちどれか、ということを表す[]記号は文字クラスという。


### 文字クラス定義[]の中で使うメタ文字（特殊な機能を持つ文字）

- [^青]とすると、「青」以外の文字にマッチする。^は否定。
- 英数字は[0-9a-zA-Z]のように、-は文字の範囲を表す。

### 定義済みの文字クラス

### 文字クラスの外で使うメタ文字

- ^は先頭一致、$は終端一致。探している文字列が文の途中ではなく、先頭にだけ、終端にだけ、にある時はマッチする
- 東京または横浜にマッチするパターンは、"/東京|横浜/u"とする。
- 繰り返しの{}。[0-9]{3}だと、3文字のあらゆる数値文字列にヒットする。{4,8}とすると4文字以上8文字以下の意味になる。
- パターンの中のパターンをサブパターンといい、()で囲むことで実現。

## 連想配列（ハッシュみたいなもの）

## 配列に値を追加する

- array_pushか、インデックス番号を指定せずに値を代入すると、追加できる

## 配列を複製する

- PHPの配列はオブジェクトではないため、変数に代入するだけで複製される。オブジェクトを代入すると、複数の変数が同じオブジェクトを指すことになる。


## 文字列を分離させる explode

- 文字列を区切り文字ごとに分離させて配列を返す

## A .= BはA = A . B

##　配列を定数にする define

## 配列の要素を削除する array_splice

- 配列と位置と文字数を指定する
- 連想配列も削除する要素をインデックス番号で渡す
- 指定した配列を置換することもできる

## +演算子で連結する

- 要素３個の配列と要素５個の配列を足すと、要素５個の後ろの２個が要素３この後ろに追加される。

## 複数の配列を連結する array_merge

## array_mergeで連想配列を連結する

- キーが重複していた場合、後から指定した値が前の値を上書きする。

## arra_merge_recursiveで連想配列を連結する

- 重複したキーの値が配列になる。

## 2つの配列から連想配列を作る array_combine

- 配列keysと配列valuesを値にした連想配列を作ることができる

## 配列から重複した値を取り除く

- 重複した値を取り除いて一つだけにする

## 配列を切り出す array_slice

- 配列を切り出して新しい配列を作れる。元の配列は変化しない

## 配列から順に値を取り出す foreach文

## 配列から条件に合う値を抽出する array_filter

- コールバック関数を渡して、array_filterが抽出した値を判定、trueなら戻り値として帰ってくる。

## 配列を分離させて項目を作れる list

## 配列をソートする sort()
- 破壊的メソッド

## 降順にソートする rsort

## 連想配列のソート 

- 値の大きさでソートしたい場合、asort,arsortを使う

## 並びをシャッフルする shuffle

- 破壊的メソッド

## 並びを逆順にする array_reverse

- 破壊的メソッド

## 自然順に並べる

- "image12", "image7"を"image7", "image12"のように並べる
- sortやasortの第２引数にSORT_NATURALを指定する

## 文字列の配列の検索（完全一致検索）

- in_arrayは文字列の検索もできます。アルファベットの大文字小文字を区別します。
- 文字列の部分一致で検索したい場合や大文字小文字を区別せずに検索したい場合は、正規表現を使った検索を利用します。

## 値が見つかった位置、キーを返す

- array_searchは見つかった値のキーを返します

## 配列を比較して違いを取り出す array_diff

- 配列Aの中から配列Bにはない値を見つけ出す

## 配列の値を検索置換する str_replace

- ３つの配列を与える。検索する側、置き換える配列、検索される側
- 配列の値で順に検索して行って、見つかったら検索終了。置き換えるデータ配列の一つ目を取り出して置換。(検索で一致している部分の文字だけ置換)戻り値あり。

## 正規表現を使って配列を検索する（部分一致検索）preg_grep

- 正規表現を使って配列の値を検索できる
- 大文字小文字を区別せずに検索する
- マッチした複数の値を取り出す

## 配列の値を関数で処理して置き換える

- $result = array_walk(&$array, $callBack, $userdata);
- 参照渡しをして引数の配列を直接書き換える

## 配列の要素で関数を実行した結果を求める array_map

- 元の配列は変化しない

## 複数の配列を並列的に処理する