デイトラ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の内容を見直したいです!