PHP

第15章 オブジェクト

  1. 最終更新日:
  2. 公開日:

この章では、前章「第14章 クラス」で作成したベースオブジェクトを使って、様々なオブジェクトを作っていきます。これまでと同様、ECサイト上の商品を題材に進めていきましょう。

ベースオブジェクトの確認

全ての商品のベースとなることを想定し、「class/Item.php」へ以下のようなオブジェクトを定義しました。

class/Item.php

<?php
class Item {

  private $genre;
  private $name;
  private $price;
  private $description;

  public function setGenre($genre=null)
  {
    $this->genre = $genre;
  }

  public function setName($name=null)
  {
    $this->name = $name;
  }
  
  public function setPrice($price=null)
  {
    $this->price = $price;
  }

  public function setDescription($description=null)
  {
    $this->description = $description;
  }

  public function getGenre()
  {
    return $this->genre;
  }

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

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

  public function getDescription()
  {
    return $this->description;
  }
}

今回はこのオブジェクトを使い、様々な商品のオブジェクトを作るコードを書いていきましょう。

商品のオブジェクトを作成

まずはベースオブジェクトを読み込む必要があります。
code15-1.php」というファイルを作成し、次のコードを入力してください。

code15-1.php

<?php
require_once 'class/Item.php';

1つ目の商品として、映画DVDのオブジェクトを作っていきます。

code15-1.php(修正)

<?php
require_once 'class/Item.php';

$movie_dvd = new Item();
$movie_dvd->setGenre("映画DVD");
$movie_dvd->setName("シンデレラ");
$movie_dvd->setPrice("2980");
$movie_dvd->setDescription("有名な童話を現代版へリメイクした作品");

これで、映画DVDのオブジェクトを1つ作ることができました。
4行目の「new Item();」でItemクラスのオブジェクトを新しく作成し、$movie_dvdへ代入しています。

それ以降の5行目〜8行目ではset系メソッドを使い、作成したオブジェクトのプロパティに映画DVDとしてのデータを設定していきます。

この調子でジーンズやパソコンのオブジェクトも作ってみましょう。

code15-1.php(修正)

<?php
--- 同文 ---

$apparel = new Item();
$apparel->setGenre("アパレル");
$apparel->setName("ジーンズ");
$apparel->setPrice("7980");
$apparel->setDescription("ベーシックなジーンズ。ロングヒット商品");

$computer = new Item();
$computer->setGenre("パソコン");
$computer->setName("GrayBookAir");
$computer->setPrice("89800");
$computer->setDescription("軽くて持ち運びに便利なノートパソコン");

3つの商品のオブジェクトを作成しました。3つとも、Itemクラスを複製して作成した、別々の独立したオブジェクトです。
プロパティもそれぞれのオブジェクトが独立して持つので、$movie_dvd$genre$apparel$genreは別の値を持つことができます。

試しに、get系メソッドで商品のリストを出力してみましょう。
次のコードを追加して実行してみてください。

code15-1.php(修正)

<?php
--- 同文 ----

echo "<h1>商品リスト</h1>";
echo "<p>" . $movie_dvd->getName() . "(" . $movie_dvd->getPrice() . "円)</p>";
echo "<p>" . $apparel->getName() . "(" . $apparel->getPrice() . "円)</p>";
echo "<p>" . $computer->getName() . "(" . $computer->getPrice() . "円)</p>";

「商品リスト」というタイトルと共に、各商品の名前と値段が一覧として出力されたでしょうか。
全てのオブジェクトで同じgetName()メソッドとgetPrice()メソッドを呼び出していますが、プロパティは独立しているため値も異なっていることを確認できると思います。

同じ要領で、この他にも自由に商品を作っていくことができます。
しかし、ある商品によっては独自のプロパティを持たせたくなるかもしれません。

例えば「第13章 オブジェクト指向」の中で、「本」には「著者」「出版社」「出版日」などのプロパティが必要になることを覚えているでしょうか。

これらのプロパティも扱うことができるようにするには、クラスの「継承」を使います。
早速、Itemクラスを継承した「本」専用のクラスを作りましょう。

Itemクラスの継承

クラスファイルを新しく1つ作成します。
classフォルダへ「BookItem.php」を作成し、次のコードを入力してください。

class/BookItem.php

<?php
require_once 'Item.php';

class BookItem extends Item {
  private $author; // 著者
  private $publisher; // 出版社
  private $publish_date // 出版日

  public function getAuthor()
  {
    return $this->author;
  }

  public function getPublisher()
  {
    return $this->publisher;
  }

  public function getPublishDate()
  {
    return $this->publish_date;
  }

  public function setAuthor($author)
  {
    $this->author = $author;
  }

  public function setPublisher($publisher)
  {
    $this->publisher = $publisher;
  }

  public function setPublishDate($publish_date)
  {
    $this->publish_date = $publish_date;
  }
}

2行目ですが、まずはともかく継承したい親クラスのファイルを読み込みます。

4行目のクラス宣言をするときに「extends Item」が付いていますが、これが親クラスであるItemクラスを継承する宣言です。

継承したクラスでは親クラスのプロパティとメソッドを自動的に引き継げることは覚えているでしょうか。
その仕組みがあるためBookItemクラスで改めて宣言する必要はなく、新しく追加したいプロパティとメソッドのみを宣言しています。

オブジェクトの扱い方は親オブジェクト(Item)と同じです。
code15-1.php」を次のように修正し、実行してみてください。

code15-1.php(修正)

<?php
require_once 'Item.php';
require_once 'class/BookItem.php';

// 商品3つのプロパティ設定

$book = new BookItem();
$book->setGenre("本");
$book->setName("PHPプログラミング");
$book->setPrice(1500);
$book->setDescription("PHPプログラミング入門書の決定版");
$book->setAuthor("山田 太郎");
$book->setPublisher("GrayCode");
$book->setPublishDate("2014-04-10");

echo "<h1>商品リスト</h1>";
echo "<p>" . $movie_dvd->getName() . "(" . $movie_dvd->getPrice() . "円)</p>";
echo "<p>" . $apparel->getName() . "(" . $apparel->getPrice() . "円)</p>";
echo "<p>" . $computer->getName() . "(" . $computer->getPrice() . "円)</p>";
echo "<p>" . $book->getName() . " " . $book->getAuthor() . "著 (";
echo $computer->getPrice() . "円) ";
echo $book->getPublisher() . ":" . $book->getPublishDate() . "</p>";

継承を使うことで、商品によって必要となる独自のデータまでも扱えるようになりました。

まとめ

この章で、PHPプログラミングの「入門」編は終了です。
第1章から読み進めていただいた方は、PHPの基本構文やオブジェクト指向を使ったプログラミングアプローチなど、これからアプリケーションを作っていく上での土台となるスキルがしっかりと身に付いたと思います。

これから先の「ベストプラクティス」編では実践的なコードを扱っていきますが、基礎力の付いた今なら確実にモノにできるはずです。
引き続き、PHPプログラミングを楽しんでください!

この章で学んだこと

  • ベースオブジェクトから拡張して独自のプロパティ、メソッドを作りたいときは「継承」を使う
  • 継承は親クラスのファイルを読み込んでから、クラス宣言時に「extends 親クラス」を指定する

記事一覧

  1. 第1章 PHPが動く仕組み
  2. 第2章 変数と定数
  3. 第3章 配列
  4. 第4章 スーパーグローバル
  5. 第5章 クッキーとセッション
  6. 第6章 サーバー情報の取得
  7. 第7章 if文
  8. 第8章 switch文
  9. 第9章 while文
  10. 第10章 for文
  11. 第11章 foreach文
  12. 第12章 独自の関数
  13. 第13章 オブジェクト指向
  14. 第14章 クラス
  15. 第15章 オブジェクト

記事一覧