デイトラweb制作上級編 DAY5

PHPでECサイトを作ってみよう②

class

class = 処理とデータの塊を作るもの、先頭は大文字

・プロパティ → データ

・メソッド → 処理

・インスタンス → クラスで定義したプロパティを受け継いでいるもの

<?php
// classの宣言
class Product {

    // プロパティ
    public $name;

}

// Productのインスタンス
$banana = new Product;

// インスタンス名->プロパティ名
// $nameに"banana"を入れる
$banana->name = "banana";

echo $banana->name;
?>

画面に表示されるのは

コンストラクターあり

→ インスタンス作成時に実行される関数

<?php
// classの宣言
class Product {

    // プロパティ
    public $name;

    // コンストラクター($「name」はなんでもOK)
    public function __construct($name) {

        // Product->name
        $this->name = $name;

    }

}

// Productのインスタンス
$banana = new Product("banana");

// $banana->name = "banana"; は必要なし

echo $banana->name;
?>

表示されるものは同じ

classを使って書き直し

①Product

functions.php

→ これは削除して代わりにproduct.phpに記述

product.php

<?php
    // classの宣言
    class Product {

        // プロパティ
        private $id;
        private $name;
        private $price;
        private $image;

        // コンストラクター
        public function __construct($id,$name,$price,$image) {
            $this->id = $id;
            $this->name = $name;
            $this->price = $price;
            $this->image = $image;
        }

        // メソッド ↓
        public function getId() {
            return $this->id;
        }

        public function getName() {
            return $this->name;
        }

        public function getPrice() {
            return $this->price;
        }

        public function getImage() {
            return $this->image;
        }
        
        // functions.php の部分 ↓
        private function calPriceIncludeTax() {
            $taxRate = 0.1;
            return $this->price + $this->price * $taxRate;
        }

        public function displayPrice() {
            $price = $this->calPriceIncludeTax();
            return $price."円";
        }
    }
?>

※calPriceIncludeTax() は displayPrice() の中でしか使われないため

→ 「private」

products.php

<?php
// product.phpの読み込み
require_once 'classes/product.php';

// Productのインスタンス
$products = [
    // 左から $id,$name,$price,$image
    new Product("avocado", "アボカド", 230, "./images/image_1.jpg"),
    new Product("orange", "オレンジ", 100, "./images/image_2.jpg"),
    new Product( "lemon", "レモン", 200, "./images/image_3.jpg"),
    new Product( "pineapple", "パイナップル", 900, "./images/image_4.jpg")
];
?>

インスタンスの

$products = new Product("入れたいもの");

new Product("入れたいもの");」 の部分が配列になっただけ

引き出すとき ↓

例:index.php

<!-- 変更前 -->
<p class="card-title"><?php echo $product["name"]; ?></p>

<!-- 変更後 -->
<p class="card-title"><?php echo $product->getName(); ?></p>

→ 商品名の表示は変わらない

②Cart

classes/cart.php

<?php
// classの宣言
class Cart {

    // プロパティ(配列)
    private static $items = [];

    public static function add($product, $count) {

        // 2つ入れて連想配列にする
        self::$items[] = ["product" => $product, "count" => $count];

    }

    public static function calTotalPrice() {
        $sum = 0;
        foreach(self::$items as $item) {
            $price = $item["product"]->displayPrice() * $item["count"];
            $sum = $sum + $price;
        }

        // calTotalPrice() に返す
        return $sum;
    }
}
?>

static ・・・ クラスのインスタンスを作らずにアクセスできる

→ 今回の場合は「$items」が Cart から直接呼び出せる

cart.php(1)

<?php
require_once 'products.php';
require_once 'classes/cart.php';

foreach ($products as $product) {
    // add($product → $product, $count → $_POST[$product->getId()])
    Cart::add($product, $_POST[$product->getId()]);
}
?>

cart.php(2)

<html>
<body>
・
・
・
<!-- 個数 × 税込価格(円) -->
<p><?php echo $_POST[$product->getId()]; ?> × <?php echo $product->displayPrice(); ?></p>

<!-- 決算完了画面に移動するボタン -->
<form method="post" action="payment.php">
<div class="btn-footer bg-gray">
    <input class="checkout-btn" type="submit" value="<?php echo Cart::calTotalPrice() . "円決済する"; ?>">
</div>
</form>
・
・
・
</body>
</html>

※payment.php は ↓

まとめ

今回でECサイトのようなアプリを作り終えました。

Day4の時よりも難しくてなかなか理解できず、進むのに苦労しました。。。

今も理解しているかは怪しいのでもう少しDay5の内容を見直したいです!

コメントを残す

メールアドレスが公開されることはありません。