【PHP】オブジェクト指向入門!初心者がマスターするための7つのステップ

PHPオブジェクト指向入門ガイドPHP
この記事は約13分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

この記事を読めば、PHPのオブジェクト指向プログラミングの基本を理解し、自分自身でコードを書くことができるようになります。

なぜなら、ここではオブジェクト指向の基本概念からPHPでの具体的な使い方、さらには応用例まで、一つ一つ丁寧に解説していきます。

そして、それぞれの項目には具体的なサンプルコードを付けて、理解を深めてもらうことに重きを置いています。

●オブジェクト指向とは

オブジェクト指向とは、現実世界の事象や概念をオブジェクトとしてモデル化し、そのオブジェクト間の交流を通じてプログラムを構築する手法を指します。

オブジェクト指向はプログラムの再利用性や拡張性、可読性を高めるために広く用いられています。

○オブジェクト指向の3つの基本概念

オブジェクト指向には主に「カプセル化」「継承」「ポリモーフィズム」という3つの基本概念があります。

  1. カプセル化:オブジェクトの状態(プロパティ)と振る舞い(メソッド)を一つにまとめ、外部から直接アクセスできないようにすることで、プログラムの安全性を確保します。
  2. 継承:あるクラスの属性や振る舞いを別のクラスが引き継ぐことで、コードの再利用性を高めます。
  3. ポリモーフィズム:同一のインターフェースで異なる動作をすることで、プログラムの柔軟性を高めます。

以上の概念を理解し、適切に活用することで、効率的で可読性の高いコードを書くことが可能になります。

これから、PHPでのオブジェクト指向プログラミングの具体的な使い方を学んでいきましょう。

●PHPでのオブジェクト指向プログラミング

PHPはオブジェクト指向の概念を完全にサポートしており、クラス、インスタンス、プロパティ、メソッド、コンストラクタ、デストラクタ、継承、ポリモーフィズムといった重要な概念を備えています。

次に、これらの要素を一つずつ詳しく解説します。

○クラスとインスタンス

クラスはオブジェクトの設計図のようなもので、インスタンスはその設計図をもとに作られた具体的なオブジェクトを指します。

下記のサンプルコードでは、Carというクラスを定義し、そのインスタンスを作成しています。

class Car {
    // クラスの定義
}

$myCar = new Car(); // Carクラスのインスタンスを作成

このコードでは、Carというクラスを定義し、そのインスタンスを作成しています。

具体的には、newキーワードを使ってCarクラスのインスタンスを作り、それを$myCar変数に代入しています。

○プロパティとメソッド

プロパティとはクラスが持つ変数のことを指し、メソッドはクラスが持つ関数のことを指します。

下記のサンプルコードでは、Carクラスにプロパティとメソッドを追加しています。

class Car {
    public $color; // プロパティ

    public function setColor($color) { // メソッド
        $this->color = $color;
    }
}

$myCar = new Car();
$myCar->setColor("赤"); // メソッドを呼び出し、プロパティに値を設定

このコードでは、Carクラスに$colorというプロパティと、setColorというメソッドを追加しています。

この例では、setColorメソッドを呼び出すことで、$colorプロパティに値を設定しています。

○コンストラクタとデストラクタ

コンストラクタはオブジェクトが生成される際に自動的に呼び出されるメソッドで、一方、デストラクタはオブジェクトが破棄されるときに自動的に呼び出されるメソッドです。

下記のサンプルコードでは、Carクラスにコンストラクタとデストラクタを追加しています。

class Car {
    public $color;

    public function __construct($color) { // コンストラクタ
        $this->color = $color;
        echo "車が生成されました。色は" . $color . "です。";
    }

    public function __destruct() { // デストラクタ
        echo $this->color . "色の車が破棄されました。";
    }
}

$myCar = new Car("赤"); // インスタンス生成時にコンストラクタが呼び出される
unset($myCar); // インスタンス破棄時にデストラクタが呼び出される

このコードでは、__constructメソッドを使ってコンストラクタを定義し、新しいCarインスタンスが生成されるときに自動的に呼び出され、車の色を設定しています。

また、__destructメソッドを使ってデストラクタを定義し、インスタンスが破棄される際に自動的に呼び出され、メッセージを出力しています。

○継承とポリモーフィズム

継承は、あるクラスの特性(プロパティやメソッド)を別のクラスが引き継ぐことを指します。

ポリモーフィズムは、一つの型またはインターフェイスに対して、さまざまな形(オブジェクト)で動作することを指します。

下記のサンプルコードでは、継承とポリモーフィズムを使った例を示しています。

class Car {
    public $color;

    public function __construct($color) {
        $this->color = $color;
    }

    public function drive() {
        echo $this->color . "色の車が走っています。";
    }
}

class Taxi extends Car { // 継承
    public function drive() { // ポリモーフィズム
        echo $this->color . "色のタクシーが走っています。";
    }
}

$myCar = new Car("赤");
$myCar->drive();

$myTaxi = new Taxi("黄");
$myTaxi->drive();

このコードでは、TaxiクラスがCarクラスを継承し、driveメソッドをオーライドしています。

その結果、Car型のオブジェクトとTaxi型のオブジェクトで、driveメソッドが異なる動作をするポリモーフィズムが実現しています。

●オブジェクト指向プログラミングの使い方

オブジェクト指向プログラミングの一連の概念と機能を使うことで、再利用可能で管理しやすいコードを書くことができます。

○サンプルコード1:クラスとインスタンスの作成

class Car {
    public $color;

    public function __construct($color) {
        $this->color = $color;
    }
}

$myCar = new Car("赤"); // インスタンス生成
echo $myCar->color; // "赤" を出力

このコードではCarクラスを定義し、そのインスタンスを作成しています。

この例では、新しいCarインスタンスを作成し、その色を設定しています。

○サンプルコード2:プロパティとメソッドの使用

class Car {
    public $color;

    public function __construct($color) {
        $this->color = $color;
    }

    public function drive() {
        echo $this->color . "色の車が走っています。";
    }
}

$myCar = new Car("赤");
$myCar->drive(); // "赤色の車が走っています。"を出力

このコードでは、Carクラスにdriveメソッドを追加し、それを使って車が走る動作を表現しています。

この例では、インスタンスのdriveメソッドを呼び出し、車が走る動作を表示しています。

○サンプルコード3:コンストラクタとデストラクタの利用

class Car {
    public $color;

    public function __construct($color) { // コンストラクタ
        $this->color = $color;
        echo "車が生成されました。色は" . $color . "です。";
    }

    public function __destruct() { // デストラクタ
        echo $this->color . "色の車が破棄されました。";
    }
}

$myCar = new Car("赤"); // インスタンス生成時にコンストラクタが呼び出される
unset($myCar); // インスタンス破棄時にデストラクタが呼び出される

このコードでは、Carクラスにコンストラクタとデストラクタを追加し、それぞれインスタンス生成時と破棄時に何が行われるかを示しています。

この例では、新しいCarインスタンスを生成し、その後で破棄しています。

生成時にはコンストラクタが、破棄時にはデストラクタが実行され、それぞれのメッセージが表示されます。

○サンプルコード4:継承とポリモーフィズムの活用

class Car {
    public $color;

    public function __construct($color) {
        $this->color = $color;
    }

    public function drive() {
        echo $this->color . "色の車が走っています。";
    }
}

class Taxi extends Car {
    public function drive() {
        echo $this->color . "色のタクシーが走っています。";
    }
}

$myCar = new Car("赤");
$myCar->drive(); // "赤色の車が走っています。"

$myTaxi = new Taxi("黄色");
$myTaxi->drive(); // "黄色のタクシーが走っています。"

このコードでは、Carクラスを継承して新しいTaxiクラスを作成し、driveメソッドをオーバーライドしています。

この例では、Car型のインスタンスとTaxi型のインスタンスで、driveメソッドが異なる動作をすることを示しています。

このように、継承とポリモーフィズムを活用することで、コードの再利用性と柔軟性を高めることができます。

●オブジェクト指向プログラミングの応用例

次に、オブジェクト指向プログラミングを利用した具体的な応用例として、商品クラスとその継承クラスを作成し、それらを操作するサンプルコードを示します。

○サンプルコード5:商品クラスの作成と利用

class Product {
    public $name;
    public $price;

    public function __construct($name, $price) {
        $this->name = $name;
        $this->price = $price;
    }

    public function display() {
        echo $this->name . "の価格は" . $this->price . "円です。";
    }
}

$myProduct = new Product("リンゴ", 200);
$myProduct->display(); // "リンゴの価格は200円です。"を出力

このコードでは、Productクラスを作成し、そのインスタンスを生成して商品情報を表示しています。

この例では、新しいProductインスタンスを作成し、そのdisplayメソッドを使って商品情報を表示しています。

○サンプルコード6:継承を活用した電子商品クラスの作成

class ElectronicProduct extends Product {
    public $warrantyPeriod;

    public function __construct($name, $price, $warrantyPeriod) {
        parent::__construct($name, $price);
        $this->warrantyPeriod = $warrantyPeriod;
    }

    public function display() {
        parent::display();
        echo "保証期間は" . $this->warrantyPeriod . "年です。";
    }
}

$myEProduct = new ElectronicProduct("テレビ", 50000, 3);
$myEProduct->display(); // "テレビの価格は50000円です。保証期間は3年です。"を出力

このコードでは、Productクラスを継承したElectronicProductクラスを作成しています。

この例では、新しいElectronicProductインスタンスを作成し、そのdisplayメソッドを使用して商品情報と保証期間を表示しています。

このように、継承を活用することで、基底クラスの機能を引き継ぎつつ、新たなプロパティやメソッドを追加することができます。

○サンプルコード7:ポリモーフィズムを利用した商品リストの表示

$products = array(
    new Product("リンゴ", 200),
    new ElectronicProduct("テレビ", 50000, 3),
    new Product("バナナ", 100),
    new ElectronicProduct("冷蔵庫", 60000, 5)
);

foreach ($products as $product) {
    $product->display();
    echo "\n";
}

このコードでは、ProductインスタンスとElectronicProductインスタンスを含む配列を作成し、それぞれのdisplayメソッドを呼び出して商品情報を表示しています。

この例では、ポリモーフィズムを利用して、異なる型のオブジェクトに対して同一の操作(ここではdisplayメソッドの呼び出し)を行っています。

このように、ポリモーフィズムを活用することで、コードの柔軟性と拡張性を高めることができます。

●注意点と対処法

オブジェクト指向プログラミングには多くの利点がありますが、その一方で慎重に扱うべきいくつかのポイントが存在します。

  1. クラスの設計:クラスは役割や責任を明確に持たせるべきです。
    一つのクラスが多すぎる責任を負ってしまうと、そのクラスが肥大化し、コードの読みやすさや保守性が損なわれます。
    そのため、単一責任の原則を心掛け、クラスが一つの役割だけを持つように設計しましょう。
  2. 継承の深度:継承は、コードの再利用性を高める一方で、適切に管理しないとコードの複雑性を増加させる可能性があります。
    継承の階層が深すぎると、クラス間の依存性が強くなり、バグの原因となる可能性があります。
    そのため、必要最低限の継承の深度に抑えることが推奨されます。
  3. カプセル化の遵守:クラス内の詳細は、できる限り隠蔽し、必要最低限の情報だけを外部に公開するようにしましょう。
    これにより、クラスの内部構造の変更が外部のコードに影響を与えることを防ぎ、コードの安全性を保つことができます。

まとめ

この記事では、オブジェクト指向プログラミングの基本的な概念と、それらを用いたプログラミングの方法について説明しました。

また、具体的なサンプルコードを通じて、クラスとインスタンスの作成、プロパティとメソッドの使用、コンストラクタとデストラクタの利用、そして継承とポリモーフィズムの活用方法についても見てきました。

オブジェクト指向プログラミングは、その特性を理解し適切に使用することで、高い生産性とコードの再利用性、保守性を実現します。

しかし、その一方で、クラスの設計や継承の関係、インスタンスの扱い方などに注意が必要です。

これらのポイントを心掛け、より良いコードを書いていきましょう。