【PHP】PHP基礎まとめ②

### クラスとオブジェクト
#### クラスを使ったサンプル
```car.php
<?php
    // 自動車クラス
    class Car {
        //　スピードのプロパティ
        public $speed;
        //　ナンバーのプロパティ
        public $number;
        //　コンストラクタ
        function __construct() {
            echo "インスタンスの生成<br>";
        }
        //　走行メソッド
        function drive() {
            echo "「{$this->number}」が{$this->speed}km/hで走行<br>";
        }
        //　停車メソッド
        function stop() {
            echo "「{$this->number}」が停車<br>";
            $this->speed = 0;
        }
    }
?>
```
```sample6-1.php
<?php
    // 自動車クラスの読み出し
    require_once("car.php");
    //　インスタンスの生成
    $car = new Car();
    //　ナンバー、スピードの設定
    $car->number = "あ12-34";
    $car->speed = 50;
    //　自動車の走行と停車
    $car->drive();
    $car->stop();
?>
```
#### 複数のインスタンス
```sample6-2.php
<?php
    // 自動車クラスの読み出し
    require_once("car.php");
    //　インスタンスの生成
    $car1 = new car();
    $car2 = new car();
    //　ナンバー、スピードの設定($car1)
    $car1->number = "あ12-34";
    $car1->speed = 50;
    // 自動車の走行と停車($car1)
    $car1->drive();
    $car1->stop();
    //　ナンバー、スピードの設定($car2)
    $car2->number = "い56-78";
    $car->speed = 40;
    //　自動車の走行と停車($car2)
     $car2->drive();
    $car2->stop();
?>
```
#### 引数とプロパティ
```sample6-3.php
<?php
    // 自動車クラス
    class Car {
        // スピードのプロパティ
        private $speed;
        //　ナンバーのプロパティ
        private $number;
        //　コンストラクタ
        function __construct($number) {
            $this->number = $number;
            echo 「"{$this->number}」　のインスタンス生成<br>";
        }
        //　走行メソッド
        function drive($speed) {
            $this->speed = $speed;
            echo "「{$this->number}」　が{$this->speed}km/hで走行<br>";
        }
        //　停車メソッド
        function stop() {
            echo "「{$this->number}」　が停車<br>";
            $this->speed = 0;
        }
    }
    //　インスタンスの生成
    $car1 = new Car("あ12-34");
    $car2 = new Car("い56-78");
    //　自動車の走行と停車
    $car1->drive(50);
    $car1->stop();
    $car2->drive(40);
    $car2->stop();
?>
```
### カプセル化・静的メンバ
#### カプセル化
```sample6-4.php
<?php
    class Person {
        // 名前
        private $name;
        // $nameのセッター
        function setName($name) {
            $this->name = $name;
        }
        // $nameのゲッター
        function getName() {
            return $this->name;
        }
    }
    //　インスタンスの生成
    $p = new Person();
    $p->setName("山田太郎");
    echo "名前：{$p->getName()}";
?>
```
#### 静的メンバ
```sample6-5.php
<?php
    class Car {
        private $serial = 0; // 製造番号（インスタンスプロパティ）
        private static $carNumber = 0; //　生産台数（静的プロパティ）
        //　コンストラクタ
        function __construct() {
            self::$carNumber++; //　静的メンバの値をインクリメント
            $this->serial = self::$carNumber; //　idを決める
        }
        //　自動車の製造番号を表示（インスタンスメソッド）
        function showSerial() {
            echo "&nbsp;&nbsp;製造番号:{$this->serial}<br>";
        }
        //　自動車の生産台数を求める（静的メソッド）
        static function showCarNumber() {
            $number = self::$carNumber;
            echo "生産台数:{$number}<br>";
        }
    }
    //　自動車の生産台数の表示
    Car::showCarNumber();
    //　1台目の自動車の生成
    $car1 = new Car();
    $car1->showSerial();
    //　自動車の生産台数の表示
    Car::showCarNumber();
    //　3台目までの自動車の生成
    $car2 = new Car();
    $car2->showSerial();
    $car3 = new Car();
    $car3->showSerial();
    //　自動車の生産台数の表示
    Car::showCarNumber();
?>
```
### 継承
#### 継承の実装
```sample6-6.php
<?php
    //　計算クラス（足し算・引き算しかできない） 
    class Calc {
        // 数値1
        protected $num1;
        // 数値2
        protected $num2;
        //　値の設定
        function setNumbers($num1, $num2) {
            $this->num1 = $num1;
            $this->num2 = $num2;
        }
        //　足し算の結果表示
        function add() {
            $ans = $this->num1 + $this->num2;
            echo "{$this->num1} + {$this->num2} = {$ans}<br>";
        }
        // 引き算の結果取得
        function sub() {
            $ans = $this->num1 - $this->num2;
            echo "{$this->num1} - {$this->num2} = {$ans}<br>"; 
        }
    }
    // 拡張計算クラス（掛け算・割り算もできる）
    class CalcEx extends Calc {
        //　掛け算の結果表示
        function mul() {
            $ans = $this->num1 * $this->num2;
            echo "{$this->num1} × {$this->num2} = {$ans}<br>";
        }
        //　割り算の結果表示
        function div() {
            $ans = $this->num1 / $this->num2;
            echo "{$this->num1} ÷ {$this->num2} = {$ans}<br>";
        }
    }
    // インスタンスの生成
    $calc = newCalcEx(); //　CalcExクラスのインタンス生成
    //　値の設定
    $carc->setNumbers(12, 3);
    // 加減乗除の計算の実行
    $calc->add(); //　加算（Calcクラスのメソッド）
    $calc->sub(); //　減算（Calcクラスのメソッド）
    $calc->mul(); //　乗算（CalcExクラスのメソッド）
    $calc->div(); //　除算（CalcExクラスのメソッド）
?>
```
### 継承の応用
#### 抽象クラスとオーバーライド
```abslist.php
<?php
    // リスト生成クラス
    abstract class Abslist {
        //　リストの開始（抽象メソッド）
        abstract function startList();
        //　リストの終了（抽象メソッド）
        abstract function endList();
        //　リスト生成メソッド
        function show($array) {
            $this->startList();
            foreach ($array as &$value) {
                echo "<li>" . $value . "</li>\n";
            }
            $this->endList();
        }
    }
?>
```
```ullist.php
<?php
    // 親クラスの読み出し
    require_once("abslist.php");
    // リストクラス(ulによるリスト)
    class UlList extends AbsList {
        // リストの開始(実装)
        function startList() {
            echo "<ul>\n";
        }
        // リストの終了(実装)
        function endlist() {
            echo "</ul>\n;
        }
    }
?>
```
```sample6-7.php
<!DOCTYPE html>
<html>
    <head>
        <title>リストの生成</title>
        <meta chaset="UTF-8">
    </head>
    <body>
        <h1></h1>
        <?php
            require_once("ullist.php");
            // UlList
            $ls = new UlList();
            //$ls = new AbsList();
            $data = ["", "", ""];
            $ls->show($data);
        ?>
    </body>
</html>
```
### クッキーとセッション
#### PHPでセッションを利用する
```sample6-8_1.php
<!DOCTYPE html>
<html>
    <head>
        <title>セッションの活用</title>
        <meta chaset="UTF-8">
    </head>
    <body>
        <h1>セッション値の生成</h1>
        <?php
            session_start(); //　セッションスタート
            $_SESSION["data"] = "PHP";
            echo "<p>セッションID:" . session_id() . "</p>";
            echo "<p>設定した値:{$_SESSION["data"]}</p>"; 
        ?>
        <a href="sample6-8_2.php>次へ</a>
    </body>
</html>
```
```sample6-8_2.php
<!DOCTYPE html>
<html>
    <head>
        <title>セッションの活用2</title>
        <meta chaset="UTF-8">
    </head>
    <body>
        <h1>セッション値の確認</h1>
        <?php
            session_start(); //　
            echo "<p>セッションID:" . session_id() . "</p>";
            echo "<p>設定した値:{$_SESSION["data"]}</p>"; 
        ?>
        <a href="sample6-8_1.php>トップへ</a>
    </body>
</html>
```
### PHPからデータベースを操作する
#### PHPでデータベースを操作する
```sample7-1.php
<?php
    try {
        // (1) 接続
        $db = new PDO('mysql:host=localhost;dbname=school', 'root', 'root');
        // (2) SQLクエリ作成
        $stmt = $db->prepare("SELECT * FROM student;");
        // (3) SQLクエリ実行
        $res = $stmt->execute();
        if ($res) {
            // (4)　該当するデータを取得
            $all = $stmt->fetchALL();
            foreach($all as $loop) {
                // (5) 結果を表示
                echo "id&nbsp;=&nbsp;" . $loop["id"];
                echo "&nbsp;name&nbsp;=&nbsp;" . $loop["name"];
                echo "&nbsp;grade&nbsp;=&nbsp;" . $loop["grade"] . "<br>";
            }
        }
        //　切断
        $db = null;
    } catch(PDOException $e) {
        echo "データベース接続失敗<br>";
        echo $e->getMessage();
    }
?>
```
・例外処理の記述
```
try {
    例外が発生しそうな処理
} catch(例外クラス　変数名) {
    例外処理
}
``` 
#### データを挿入する
```sample7-2.php
<?php 
    try {
        // (1) 接続
        $db = new PDO('mysql:host=localhost;dbname=school', 'root', 'root');
        // (2) 挿入するデータの作成
        $id = 3003;
        $name = "";
        $grade = 3;
        // (3) SQLクエリ作成
        $stmt = $db->prepare("INSERT INTO student VALUES(?, ?, ?);"); 
        $stmt->bindParam(1, $id, PDO::PARAM_INT);
        $stmt->bindParam(2, $name, PDO::PARAM_STR);
        $stmt->bindParam(1, $grade, PDO::PARAM_INT);
        // (4) SQL  
        $res = $stmt->execute();
        // (5)
        $db = null;
    } catch(PDOException $e) {
        echo "データベース接続失敗<br>";
        echo $e->getMessage();
    }
?>
``` 
## 参考
https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7PHP%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8C%E5%AD%A6%E3%81%B9%E3%82%8B%E6%9C%AC-1%E9%80%B1%E9%96%93%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%BA%80%E7%94%B0-%E5%81%A5%E5%8F%B8/dp/4295013579/ref=sr_1_4_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1S0ATLMOB44O5&keywords=php&qid=1680187881&sprefix=php%2Caps%2C213&sr=8-4-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExSVRKSkw1Q0U2WUZGJmVuY3J5cHRlZElkPUEwMDA5MTI0Wkg2OUdPMTJPR0RVJmVuY3J5cHRlZEFkSWQ9QTI0S0FWTUY4NFNNUjgmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl