php_オブジェクト指向

11オブジェクト指向

<aside> 💡 プログラムを手順ではなくシステム全体を「モノ」として見立て、人間がわかりやすい構造を保つための仕組み、考え方。

</aside>

なぜオブジェクト指向を用いるのか?

  • 効率よくプログラムを設計・開発しやすくなる
    • プログラムが小さな単位でまとまっているため他の処理でも再利用しやすくなる
  • 不具合の原因特定がしやすくなる
    • プログラムが小さな単位でまとまっているため不具合を見つけやすくなる
  • 仕様が変わっても変更しやすくなる

ここからオブジェクト指向の説明で用いられる単語について紹介していきます。

現実世界の物で例えるとイメージが付きやすいと思うので、車で例えて紹介していきます。

オブジェクト

オブジェクトはそのまま「モノ」という意味。

プログラミングにおいては、データや処理の集まりを指す。

例:

  • 車そのもの
  • 車というオブジェクトは「メーカー」、「色」というデータや「前進する」、「停止する」といった処理を含む

クラス

オブジェクトを作成するための「設計図」みたいなもの。

例:

  • 自動車を作る元となる設計図
<?php
class Car {
}
?>

インスタンス

クラスから生成した実体のこと。

例:

  • 「車」というクラスをもとに「トラック」や「パトカー」を作るとすると、「トラック」や「パトカー」のこと
<?php
$car = new Car();
?>

プロパティ

オブジェクトが持つ性質や属性のことを指す。

例:

  • 車でいうと「メーカー」、「色」、「走行距離」などの性質を指す
<?php
class Car {
    private $maker;
    private $color;
    private $mileage
}
?>

メソッド

オブジェクトが持っている振る舞いや処理を指す。

例:

  • 車でいうと「アクセルを踏むと動く」、「ブレーキを踏むと止まる」などの振る舞いを指す
<?php
class Car {
    public function stepGas() {
        // 車を動かす処理
    }
    public function stepBrakes() {
        // 車を止める処理
    }
}
?>

ここからオブジェクト指向で用いる重要な考え方について紹介します。

継承

同じようなプログラムをまとめ、コードを再利用しやすくする仕組み。

似たようなオブジェクトを複数作成する場合に継承を使うことで同じ機能の実装をすることができる。

<?php
// 車の基本的な機能を持ったベースとなるクラス
class BaseCar {
    public function stepGas() {
        // 車を動かす処理
    }
    public function stepBrakes() {
        // 車を止める処理
    }
}

// 基本機能を持った車クラスを継承して、パトカークラスを作る
class PoliceCar extends BaseCar{
    public function soundSiren() {
        // サイレンを鳴らす処理
    }
}

$policeCar = new PoliceCar(); // インスタンスを生成
$policeCar->soundSiren(); // サイレンを鳴らす処理

// 継承した親クラスのメソッドを呼ぶことも可能
$policeCar->stepGas(); // 車を動かす処理
$policeCar->stepBrakes(); // 車を止める処理
?>

ポリモーフィズム

同じメソッドを呼び出してもオブジェクトが変われば振る舞いが変わること。

<?php
// 車の基本的な機能を持ったベースとなるクラス
class BaseCar {
    public function soundHorn() {
        // 「ブー」というクラクションを鳴らす処理
    }
}

// HogeCarもFugaCarも同じBaseCarを継承していて、
// BaseCarにあるメソッドと同様のメソッドを持っている
class HogeCar extends BaseCar{
    public function soundHorn() {
        // 「ボー」というクラクションを鳴らす処理
    }
}
class FugaCar extends BaseCar{
    public function soundHorn() {
        // 「ピッ」というクラクションを鳴らす処理
    }
}

$hogeCar = new HogeCar(); // インスタンスを生成
$fugaCar = new FugaCar(); // インスタンスを生成

// メソッドを呼び出す
$hogeCar->soundHorn() // 「ボー」というクラクションを鳴る
$fugaCar->soundHorn() // 「ピッ」というクラクションを鳴る
?>

カプセル化

簡潔に説明すると、外部から操作できる範囲を限定すること。

<aside> 💡 車で例えると、運転手はアクセルを踏むことで車が進み、ブレーキを踏むことで車が止まることさえ知っていれば運転することができる。 だが、運転手はアクセルを踏んだ際の車内部の処理までは把握していない。 内部構造まで把握しなくても利用者は使用することができる。

</aside>

プログラム実装者も必要な機能のみ利用できれば、詳細に内部構造を理解しなくて済むため、効率よく開発していくことができる。

他のメリットとして、適切にアクセス範囲を設けることで予期せぬ不具合などを防ぐことができる点もある。

<?php
class Car {
    private $maker; // 外からアクセスできない
    public $color;  // 外からアクセスできる

    // 外からアクセスできない
    private function hoge() {
    }

    // 外からアクセスできる
    public function fuga() {
    }
}
?>


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です