PHPプログラミング

最終更新日:
公開日:

入門

第15章 オブジェクト

この章では、前章「第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 親クラスを指定する