[PHP]PHPの基本まとめ

## はじめに
学習したことを自分用の参考書のようにまとめていきます。

## PHPとは
PHP (PHP: Hypertext Preprocessor を再帰的に略したものです) は、動的にWebページを生成することができるサーバーサイドのスクリプト言語です。


## 環境構築

PHPではPC内に動作環境を用意してあげなければなりません。
動作環境を構築するために、Macの方は下記URLより「MAMP」をインストールしましょう。

- MAMP公式

https://www.mamp.info/en/mac/

- MAMP インストール・操作方法 参考サイト

https://magazine.techacademy.jp/magazine/5102#sec2


## PHPの始め方

1. MAMPフォルダの中から"htdocs"という名前のフォルダを開く
2. htdocsフォルダの中に"php_test"というフォルダを新たに作成する
3. 作成したフォルダの中に"index.php"という名前のファイルを作成する
4. 作成したindex.phpを編集する
5. MAMPを開く
6. Start Serverボタン押す
7. [http://localhost:8888/php_test/](http://localhost:8888/php_test/)にアクセスする

MAMP起動 参考サイト

https://pc-karuma.net/mamp-start-stop/


## PHPの書き方

### `<?php ?>`
PHPは **`<?php`** ではじまり、 **`?>`** で閉じます。

```php:index.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <p><?php echo "文字を出力"; ?></p>
</body>
</html>
```

### var_dump()
var_dump()は変数や配列の情報を表示する関数です。
()の中に情報を出力する変数or配列を入力します。


```php:例
<?php
    var_dump('var');
?>
```


### 変数

```php:例
<?php
    $text = "変数";
    echo $text;
?>
```
:::note info
変数名の命名規則
・名前には半角英数字とアンダースコア「_」のみ使用する。
・先頭に数字を使わない。
・先頭に大文字を使わない。
・予約語を使わない。
:::


### データ型について

PHPのデータ型を下記の表にまとめてみました。
var_dump()を使うことで、データ型を簡単に調べることができます。

| 型名 | 説明 |
|:----|:----|
|真偽値(Boolean)|trueまたはfalse|
|整数(Int)|-1、0、1などの整数|
|浮動小数点(Float)|3.14のような小数点数|
|文字列(String)|"テキスト"などの文字列|
|配列(Array)|複数のデータの集合|
|オブジェクト(Object)|データと手続きの集合|
|リソース(Resource)|外部リソースへの参照|
|Null|値が存在しないことを意味する|


### 算術演算子

| 種類 | 説明 |
|:----|:----|
|+|加算演算子：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に代入する」|
|-=|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 > 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が厳密に等しくない」|


### 論理演算子

| 種類 | 説明 |
|:----|:----|
|論理積(AND)|A && B 「AかつB」|
|論理和(OR)|A \|\| B 「AまたはB」|
|否定(NOT)|!A 「Aではない」|



## 条件分岐
条件分岐とは、ある条件が満たされているかどうかによって、次に実行するプログラムを変化させることです。


### if文

```php:例
if (条件式) {
  // trueの場合の処理を記述
}
```

```php:例
if (条件式) {
  // trueの場合の処理を記述
} elseif (条件式) {
  // ifの条件式ではfalseだが、else ifの条件式ではtrueだった場合の処理を記述
  // else ifは何個でも記述可能
} else {
  // どれにも当てはまらなかった時の処理を記述
}
```

### switch文

```php:例
<?php
  switch (式) {
    case 値1:
      // 式と値1が等しい時の処理
      break;
    case 値2:
      // 式と値2が等しい時の処理
      break;
    default:
      // それ以外の場合の処理
  }
?>
```


## 繰り返し処理
繰り返し処理とは、同じことを何回も実行させることです。

### for文

```php:例
  for ($i = 0; $i < 10; $i++) {
    繰り返し処理;
  }
```

### while文

```php:例
<?php
  $num = 10;
  while ($num > 0){
    繰り返し処理;
    $num--;
  }
?>
```

### foreach文

```php:例
<?php
  $test = [ '国語', '算数', '理科', '社会' ];
  foreach ( $tests as $test ) {
    echo $test. '<br>';
  }
?>
```


## 関数

下記が関数の記述です。
```php:例
<?php
  function 関数名() {
    // 処理
  }
?>
```

### 戻り値
戻り値を記述することで、関数の呼び出し元へ値を返すことができます。
下記のように記述します。

```php:例
<?php
  function 関数名() {
    // 処理

    return 戻り値;
  }
?>
```

### 引数

```php:例
<?php
  function sample($text) {
    echo $text;
  }

  sample('引数');
?>
```


## 外部ファイルの関数呼び出し
下記のように記述することで、外部ファイルに定義した関数を呼び出し使用することができます。

```php:index.php
<?php
  require "function.php"; //外部ファイルの呼び出し

  $a = 2;
  $b = 1;
  $c = $a - $b;

  echo sample($a);
  echo "<br>";

  echo sample($b);

  echo "<br>";

  echo sample($c);
?>
```

```php:function.php
<?php 
  function sample($data){
    if($data == 1){
        return "a";
    }else if($data == 2){
        return "b";
    }else{
        return "c";
    }  
  }
?>
```


## クラスとインスタンス

PHPにおいて、クラスとインスタンスはオブジェクト指向プログラミングの基本的な概念になります。

クラスとは、変数（プロパティ）と関数（メソッド）の１つの設計図にします。
これにより、同じ種類のオブジェクトを作成するための共通の特性や振る舞いを定義できます。

インスタンスとは、クラスの実際のオブジェクトを指します。
クラスをインスタンス化することで、そのクラスの特定のオブジェクトが生成されます。

イメージは設計図を書いた後に、設計図を元に実体化させていくといったイメージです。


### クラス

```php:例
<?php

class クラス名 {
      public $変数名;
      public $変数名;

      public function 関数名(){
            実行内容
      }
}

?>
```

### インスタンス

```php:例
<?php

  $インスタンス名 = new クラス名();
  $インスタンス名->変数名 = 値;
  $インスタンス名->関数名();

?>
```

### クラスの継承

```php:例
<?php
  class 新しいクラス名 extends 継承したいクラス名{

    public $変数名;
    public $変数名;

    public function 関数名(){
      //実行内容
  }
?>
```

### アクセス修飾子

| 種類 | 説明 |
|:----|:----|
|public|継承可能 アクセス修飾子の定義が無い場合にはpublic扱い|
|private|継承不可能|
|protected|継承可能 privateとpublicの中間的存在であり、継承したクラスからは参照できる非公開な要素|


### 使い方

簡単な内容ですが、下記のように使います。
"いすは5000円です" と出力されていると思います。

```php:index.php
<?php

  // クラス
  class Item {
    public $name;
    public $price;

    public function much(){
      echo $this->name . "は" . $this->price . "円です" ;
    }
  }

  // インスタンス
  $chair = new Item();
  $chair->name = "いす";
  $chair->price = 5000;
  $chair->much();

?>
```


## formでデータを受け取る

HTMLのform要素を使ってデータを **GET** と **POST** の2通りの方法で受け取ることができます。

<dl>
  <dt>GET</dt>
  <dd>データがURLで引き渡される。画面に出て分かる。</dd>
  <dt>POST</dt>
  <dd>データがURLで引き渡されない。大量に送るのに適している。</dd>
</dl>


### GETでデータを受け取る

```php:index.php
<!DOCTYPE html>
<html>
  <head>
    <title>GETでデータを受け取る</title>
    <meta charset="UTF-8">
  </head>
  <body>
    <form action="./receive.php" method="GET">
      <br>
      姓：<input type="text" name="family_name">
      <br>
      名：<input type="text" name="first_name">
      <br>
      <input type="submit" value="送信">
      <br>
    </form>
  </body>
</html>
```

```php:receive.php
<?php
  var_dump($_GET["family_name"]);
  var_dump($_GET["first_name"]);
?>
```

上記の"index.php"が送信側、"receive.php"が受信側になります。

フォームに値を入力し、送信ボタンを押してみましょう。
成功するとURLが、localhost:8888/get/receive.phpの後に "?family_name=入力内容&first_name=入力内容" となっていると思います。

このようにGETの場合、URLに記述されデータを受け取ることができます。


### POSTでデータを受け取る

```php:index.php
<!DOCTYPE html>
<html>
  <head>
    <title>POSTでデータを受け取る</title>
    <meta charset="UTF-8">
  </head>
  <body>
    <form action="./receive.php" method="POST">
      <br>
      姓：<input type="text" name="family_name">
      <br>
      名：<input type="text" name="first_name">
      <br>
      <input type="submit" value="送信">
      <br>
    </form>
  </body>
</html>
```

```php:receive.php
<?php
  var_dump($_POST["family_name"]);
  var_dump($_POST["first_name"]);
?>
```

上記の"index.php"が送信側、"receive.php"が受信側になります。

フォームに値を入力し、送信ボタンを押してみましょう。
成功するとURLが、localhost:8888/post/receive.phpだけになっていると思います。

このようにPOSTの場合、URLに表示されません。


## メール送信処理

```php:
<?php
  mb_language("Japanese"); 
  mb_internal_encoding("UTF-8");

  $email = "xxxxxx@example.com"; //送信元
  $subject = "題名"; 
  $body = "これは本文です。\n";
  $to = 'xxxxxx@example.com'; // 宛先
  $header = "From: $email\nReply-To: $email\n";

  mb_send_mail($to, $subject, $body, $header);
?>
```

mb_send_mail関数を使いますが、初期設定等が必要なります。
下記リンクは参考になるサイトですので、見てみてください。

https://dezanari.com/mamp-mail/

https://qiita.com/pocha_hiyo/items/9b0b751d09c3661e4ca8


## さいごに
いかがだったでしょうか。

他にもいろいろな記事を書いているのでぜひ読んでいただけたら嬉しいです。