まえがき
はじめまして。
PHPを使った開発を行う上でなかなかイメージが掴みづらい「オブジェクト指向」という概念ですが、
実際どのようにコーディングして、どのようなシチュエーションで利用すると便利なのか、検証して理解した事をまとめてみようと思います。
注意事項
PHPバージョン:8.0.1
ソース
まずはソースから記載するのですが、処理の動きとしては、
- 継承先となるextendClass.phpから、継承元のclass.phpを呼び出す
- extendClass.php上でclass.php上で設計された機能(メソッド)を使う
というようなイメージとなります。
class.php
<?php
// オブジェクト指向の簡単なデモ
class Car
{
private $maker; //メーカー
private $name; //車名
private $model; //型式
private $displacement; //排気量
private $fuelEconomy; //燃費
private $fuelCapacity; //燃料容量
private $price; //価格
function __construct($maker, $name, $model, $displacement, $fuelEconomy, $fuelCapacity, $price)
{
// メンバ変数を初期化
$this->maker = $maker;
$this->name = $name;
$this->model = $model;
$this->displacement = $displacement;
$this->fuelEconomy = $fuelEconomy;
$this->fuelCapacity = $fuelCapacity;
$this->price = $price;
}
// 小さい単位のデータ取得、処理 ------------------------------------------------------
// ゲッター(メーカー)
public function getMaker(){ return $this->maker; }
// ゲッター(型式)
public function getModel(){ return $this->model; }
// メンバ関数(メソッド)
public function getLogicalMileage()
{
// 論理走行距離(燃費 * 燃料容量)
return $this->fuelEconomy * $this->fuelCapacity;
}
public function getLMOfPrice()
{
// 1万円あたりの走行距離(小数点第二で切り上げ)
return round($this->getLogicalMileage() / $this->price, 2);
}
// クラス内で生成したデータを成形するメソッド -----------------------------------------
/**
* ゲッター、メンバ関数を用いて
* 説明文の生成するメソッド
*/
public function getDescription()
{
$text = "";
$text = $this->getMaker(). "の". $this->getModel(). "は、";
$text .= "論理走行距離が". $this->getLogicalMileage(). "km";
$text .= "であり、";
$text .= "車両価格対走行距離が1万円あたり". $this->getLMOfPrice(). "km";
$text .= "です。";
return $text;
}
}
extendClass.php
<?php
echo phpinfo();
// クラスファイル読み込み
require 'class.php';
// 引数は可変値、設計書は使いまわすイメージ
$car1 = new Car("トヨタ", "ランドクルーザー", "4.6GX", 4608, 93, 6.9, 437.8);
$car2 = new Car("ホンダ", "ヴェゼル", "1.5 G Honda SENSING", 1496, 40, 21.2, 192.1);
$car3 = new Car("三菱", "アウトランダー", "20M", 1998, 63, 16.0, 247.8);
// 各オブジェクトから生成された説明文を出力
echo "<pre>";
var_dump($car1->getDescription());
var_dump($car2->getDescription());
var_dump($car3->getDescription());
// string(124) "トヨタの4.6GXは、論理走行距離が641.7kmであり、車両価格対走行距離が1万円あたり1.47kmです。"
// string(136) "ホンダの1.5 G Honda SENSINGは、論理走行距離が848kmであり、車両価格対走行距離が1万円あたり4.41kmです。"
// string(118) "三菱の20Mは、論理走行距離が1008kmであり、車両価格対走行距離が1万円あたり4.07kmです。"
あとがき
オブジェクト思考を利用した開発を行う事で、
具体的な動きと入力される情報の置き場所を分けてコーディングする事ができ、
棲み分けを行う事ができるのは非常に良いなと感じました。
ただし、上記のような考え方を落とし込みながらシステムの要件定義や設計を行う必要があり、
そのためには時間が必要となりそう & 慣れが必要となんだろうなと思いました。