PHP基礎

#PHPの宣言
HTMLでPHPを宣言するには`<?php ?>`内に記述する。
また１行の場合は、末尾の`;`を省略できる。

```sample.php
<?php
    echo "Hello World!";
    echo "Hello PHP!";
?>

// １行の時は、セミコロン不要
<?php echo "Hello World!" ?>
```

#変数
変数の宣言と使用

```sample.php
<?php
    $name = "Bob" ;
    echo $name ;

    echo "私の名前は{$name}です";
?>
```

#計算
加減乗除

```sample.php
<?php
    echo a + b ;
    echo a - b ;
    echo a * b ;
    echo a / b ;
    echo a % b ;
?>
```

簡略化した書き方

```sample.php
<?php
    $x = $x + 10;  →  $x += 10;
    $x = $x - 10;  →  $x -= 10;
    $x = $x * 10;  →  $x *= 10;
    $x = $x / 10;  →  $x /= 10;
    $x = $x % 10;  →  $x %= 10;
?>
```

インクリメント、デクリメント

```sample.php
<?php
  // 後置演算
    $x += 1;  →  $x++;
    $x -= 1;  →  $x--;

  // 前置演算
    $x += 1;  →  ++$x;
    $x -= 1;  →  --$x;
?>
```

#文字列結合
```sample.php
<?php
    $x = "文字";
    $y = "連結";
    echo $x.$y;

  // 省略記述
    $x .= "連結";
?>
```

#条件分岐

```sample.php
<?php
    if ($x > 10) {
        // true
    } elseif (!($x <= 5)) {  //否定
        // true
    } else {
        // false
    }
?>
```

比較演算子

| 条件 | 記法 |
|:-:|:-:|
| より大きい、より小さい  | <、>  |
| 以上、以下  | <=、>=  |
| 等しい  | ==  |
| 等しくない  | !=  |

論理演算子

| 条件 | 記法 |
|:-:|:-:|
| かつ  | &&  |
| または  | ||  |

その他の判定

| 条件 | 記法 |
|:-:|:-:|
| 特定のクラスのインスタンスがどうか  | インスタンス instanceof クラス名  |
|   |   |

#switch文

```sample.php
<?php
    switch($coin){
        case 0:
            echo "表";
            break;
        case 1:
            echo "裏";
            break;
        default:
            echo "エラー";
            break;
    }
?>
```

#配列

```sample.php
<?php
  // 配列の生成
    $names = array("John", "kate", "Bob");
    echo $names[0];
  
  // 配列の末尾に追加
    $names[] = "Mary";

  // 値の上書き
    $names[1] = "Jane";
?>
```

#連想配列

```sample.php
<?php
  // 配列の生成
    $user = array(
                       "name" => "わんこ",
                       "age" => 14,
                       "gender" => "male"
                   );
    echo $user["name"];
  
  // 値の追加
    $user["level"] = "beginner";

?>
```

#for文

```sample.php
<?php
    for($i = 1; $i <= 100; $i++){
        if($i % 3 == 0){
            continue;
        }elseif($i >90){
            break;
        }
        echo $i ."<br>";
    }
?>
```

#foreach文

```sample.php
<?php
    $towns = array("東京", "大阪", "京都");
    foreach($towns as $town){
        each $town." ";
    }

    $user = array(
                       "name" => "わんこ",
                       "age" => 14,
                       "gender" => "male"
                   );
    foreach($user as $key => $value){
        echo $key." ".$value." ";
    }
?>
```

#while文

```sample.php
<?php
    $i = 1;
    while($i <=100){
        echo $i;
        $i++;
    }
?>
```

#HTMLに埋め込む場合の書き方（推奨）
HTML内で__for文__や__if文__など記述するときは、可読性を上げるため単一行で`<?php ?>`を完結させるようにした方が良い。

1. 先頭の`{`→`:`にする
1. 末尾の`}`→`end〇〇`にする（endfor,endif,endswitchなど）

```sample.php
<?php $towns = array("東京", "大阪", "京都") ?>

<?php foreach($towns as $town): ?>  // { → :
    <p><?php echo $town." " ?></p>
<?php endforeach ?>                 // } → end〇〇
```

#関数

```sample.php
<?php
  // 関数生成
    function printCircleArea($radius){
        echo $radius * $radius;
    }

    function getSum($num1, $num2){
        return $num1 + $num2;
    }

  //  関数呼び出し
    printCircleArea(10);
    $sum = getSum(1,3);

?>
```

#クラス

```sample.php
<?php
  // クラス
    class Menu{
        public $name;

      //コンストラクタ
        public function __construct(){
            $this->name;
        }

        public function hello(){
            echo '名前：'.$this->name;
        }
    }

  //  インスタンス生成
    $curry = new Menu();

  // プロパティ値の設定、呼び出し
    $curry->name = 'CURRY';
    echo $curry->name;

  // メソッド呼び出し
    $curry->hello();
?>
```

プロパティ＝インスタンスが持つデータのこと
メソッド　＝インスタンスに関連する処理（関数）のこと

#他ファイルの読み込み（インポート）

```menu.php
<?php
    class Menu{
        public $name;

        public function __construct($name){
            $this->name = $name;
        }

        public function hello(){
            echo '名前：'.$this->name;
        }
    }
?>
```

```data.php
<?php
    require_once("menu.php");
    $curry = new Menu("CURRY");
?>
```

```index.php
<?php require_once("data.php") ?>
<body>
    <p> <?php echo $curry->name ?> </p>
</body>
```

#カプセル化
プロパティを`public`→`private`にし、`getter``setter`で読み書き込みするようにする。

```menu.php
<?php
    class Menu{
        private $name;  //public → private
              :
      // getter
        public function getName(){
            return this->name;
        }
      // setter
        public function setName($name){
            $this->name = $name;
        }
    }
?>
```

```data.php
<?php
    require_once("menu.php");

    $curry = new Menu();
    $curry->setName("CURRY");  //setterでプロパティ設定
?>
```

```index.php
<?php require_once("data.php") ?>
<body>
    <p> <?php echo $curry->getName() ?> </p> // getterでプロパティ取得
</body>
```

#クラスプロパティ
個々のインスタンスがもつデータ（プロパティ）ではなく、クラスがもつデータをクラスプロパティという。
クラスプロパティは`static`を用いて定義する。
クラスプロパティにアクセスする場合は`クラス名::$クラスプロパティ名`と定義する（publicの場合）
クラス内でクラスプロパティにアクセスする場合は`self::$クラスプロパティ名`と定義する

```sample.php
<?php
    class Menu{
      // クラスプロパティ
        private static $count = 4;  //static付与

        public function __construct(){
            self::$count++;              //クラス内でのアクセス
        }

        public static function getCount(){  //static付与
            return self::$count;
        }
    }

    echo "メニュー：".Menu::$count."品";  // クラスプロパティの呼び出し（publicの場合）
    echo "メニュー：".Menu::getCount()."品";  //クラスプロパティの呼び出し
?>
```

#継承
継承を用いて新しく子クラスを定義するときは、「class 子クラス名 extends 親クラス名」のように書く

```sample.php
<?php
    class Drink extends Menu{
       :
    }
    $coffee = new Drink("COFFEE", 600, .....);
    echo $coffee->getName();
?>
```

#オーバーライド
親クラスに対するメソッドの上書きを「オーバーライド」と言う。
オーバーライドの際に親クラスで定義したメソッドを呼び出したいときには、「parent::メソッド名」とすることで親クラスのメソッドを実行することができる。

```drink.php
<?php
    class Drink extends Menu{
        private $type;

        public function __construct($name, $price, $image, $type){
            parent::__construct($name, $price, $image,);  // 親クラスの呼び出し
            this-> type = $type;
        }
    }
?>
```

```menu.php
<?php
    class Menu{
        protected $name;
        protected $price;
        protected $image;
            
        public function __construct($name, $price, $image){
            this-> name = $name;    
            this-> price = $price;
            this-> image = $image;
        }
    }
?>
```