PHPのオブジェクト指向プログラミング(OOP)の概念と例

⚡ スマートサマリー

PHPにおけるオブジェクト指向プログラミングは、クラスとオブジェクトを用いて現実世界のオブジェクトを中心としたアプリケーションを構築します。このチュートリアルでは、カプセル化、継承、ポリモーフィズムといったオブジェクト指向プログラミングの原則、PHPがそれらをどのようにサポートしているか、そして実際に動作するクラス、継承、インターフェースの例を段階的に解説します。

  • 🧱 クラスとオブジェクト: クラスは現実世界の事物のプロパティとメソッドを定義し、オブジェクトはそのクラスの単一のインスタンスである。
  • 🔒 カプセル化: 公開されたgetメソッドとsetメソッドを持つプライベート変数は、内部の詳細を隠蔽し、オブジェクトの状態を保護します。
  • 👪 継承: extendsキーワードを使用すると、子クラスが親クラスのメソッドを再利用できるため、コードの重複を減らすことができます。
  • 🔁 ポリモーフィズム: インターフェースは、多くのクラスが統一された概念の背後で異なる方法で実装する標準メソッドを定義します。tract.
  • 📐 UMLクラス図: クラス図は、クラス名、変数、メソッドを示し、プラス記号、マイナス記号、ハッシュ記号でそれぞれパブリック、プライベート、プロテクテッドのスコープを表します。
  • 🧩 インターフェースとアブtract: 腹筋tractクラスは共通のコードを共有する一方、インターフェースは各ドライバクラスが同じメソッドを提供することを保証する。
  • 🤖 AIアシスト: AIツールは、記述からPHPクラスを生成し、手続き型コードをクリーンなオブジェクト指向コードにリファクタリングすることができる。

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

OOPとは何ですか?

オブジェクト指向プログラミングとは、従業員、自動車、銀行口座といった現実世界のオブジェクトをモデルとしてアプリケーションを構築するソフトウェア開発手法です。クラスは、現実世界のオブジェクトのプロパティとメソッドを定義します。オブジェクトは、クラスのインスタンスです。

オブジェクト指向の3つの基本要素は次のとおりです。

  • オブジェクト指向分析 – システムの機能
  • オブジェクト指向設計 – システムのアーキテクチャ
  • オブジェクト指向プログラミング – アプリケーションの実装

オブジェクト指向プログラミングの原則

オブジェクト指向プログラミングの3つの主要原則は以下のとおりです。

  • カプセル化 これは、実装の詳細を隠蔽し、メソッドのみを公開することに関係しています。カプセル化の主な目的は次のとおりです。
    • ソフトウェア開発の複雑さを軽減します。実装の詳細を隠し、操作のみを公開することで、クラスの使用が容易になります。
    • オブジェクトの内部状態を保護するため、クラス変数へのアクセスはgetやsetなどのメソッドを介して行います。これにより、クラスの柔軟性と保守性が向上します。
    • クラスの内部実装を変更しても、そのクラスを使用するコードが壊れる心配がないようにする。
  • 継承 これはクラス間の関係に関するものです。その関係は親と子の形をとります。子は親クラスで定義されたメソッドを使用します。継承の主な目的は次のとおりです。
    • 再利用性 – 複数の子クラスが同じ親クラスから継承できます。これは、データベースへのデータの追加、更新、削除といった共通の機能を提供する必要がある場合に非常に便利です。
  • ポリモーフィズム これは、多くの異なる実装を持つ単一のインターフェースを持つことに関係しています。ポリモーフィズムの主な目的は次のとおりです。
    • アプリケーションの保守を簡素化し、拡張性を高めるため。

おっとっと Concepts PHPで

PHPはオブジェクト指向スクリプト言語であり、上記のすべての原則をサポートしています。上記の原則は、以下の方法で実現されます。

  • カプセル化 – 「get」メソッドと「set」メソッド、およびアクセス修飾子を使用することによって。
  • 継承 – extendキーワードの使用による
  • ポリモーフィズム – implementsキーワードの使用による

OOP の基本的な知識と、OOP がどのようにサポートされているかを理解しました。 PHPそれでは、上記の原則を実践している例を見ていきましょう。

UMLとは?

統一モデリング言語(UML)は、オブジェクト指向システムの設計と文書化に使用される手法です。

UMLは多くのドキュメントを生成しますが、ここではオブジェクト指向PHPプログラミングにおいて非常に重要なクラス図について見ていきます。

クラス図の例

おっとっと Concepts PHPで

クラス図のキー

  • その 上部ボックス クラス名が含まれています
  • その 中央のボックス クラス変数が含まれています
  • その 下のボックス クラスメソッドが含まれています
  • その マイナス(-) サインはプライベートな範囲を意味します
  • その プラス(+) 記号は公開範囲を意味します
  • その ハッシュ(#) 記号は保護範囲を意味します

PHP でクラスを作成する方法

class キーワードは、PHP でクラスを定義するために使用されます。 以下は、PHP でクラスを作成するためのルールです。

  • クラス名は文字で始まる必要があります
  • クラス名に PHP の予約語を使用することはできません
  • クラス名にはスペースを含めることはできません

動物を表すクラスを作成したいとしましょう。まずは、すべての動物に共通する特徴を特定することから始めます。

  • すべての動物は、草食動物、肉食動物など、何らかの科に属しています。
  • すべての動物は食べ物を食べます

下の図は、動物のクラス図を示しています。

PHPでクラスを作成する

それでは、Animalクラスのコードを書いてみましょう。

<?php
class Animal
{
    private $family;
    private $food;
    public function __construct($family, $food)
    {
        $this->family = $family;
        $this->food = $food;
    }
    public function get_family()
    {
        return $this->family;
    }
    public function set_family($family)
    {
        $this->family = $family;
    }
    public function get_food()
    {
        return $this->food;
    }
    public function set_food($food)
    {
        $this->food = $food;
    }
}
?>

ここに、

  • 「private $family, $food」とは、変数がクラスの外部から直接アクセスできないことを意味します(カプセル化)。
  • 「public function __construct($family…)」はPHPのコンストラクタメソッドです。この関数は、クラスのインスタンスが作成されるたびに呼び出されます。この例では、家族と食べ物を設定しています。
  • 「public function get…()」は、ファミリーまたは食品の値にアクセスするために使用されるメソッドです(カプセル化)。
  • 「public function set…()」は、ファミリーまたは食品の値を設定するために使用されるメソッドです(カプセル化)。

PHPで継承を実装する方法

私たちは牛とライオンと一緒に働きます。 ウシとライオンはどちらも Animal クラスを継承しています。

以下のクラス図はその関係を示しています。

PHPで継承を実装する

牛はAnimalクラスを継承し、独自の変数とメソッドも定義していることに注意してください。

それでは、Cowクラスのコードを書いてみましょう。

<?php
class Cow extends Animal
{
    private $owner;
    public function __construct($family, $food)
    {
        parent::__construct($family, $food);
    }
    public function set_owner($owner)
    {
        $this->owner = $owner;
    }
    public function get_owner()
    {
        return $this->owner;
    }
}
?>

それでは、Lionクラスのコードを書いてみましょう。

<?php
class Lion extends Animal
{
    public function __construct($family, $food)
    {
        parent::__construct($family, $food);
    }
}
?>

ここに、

  • 「class … extends Animal」は、CowクラスとLionクラスがAnimalクラスのメソッドを使用するようにします(継承)。

クラスのオブジェクトを作成する方法

わかりやすくするために、Animal、Cow、Lion のクラスはすべて同じディレクトリに存在する必要があります。

それでは、これらのクラスを使用するアプリケーションを作成しましょう。

PHP クラスの例

<?php
require 'Animal.php';
require 'Cow.php';
require 'Lion.php';
$cow = new Cow('Herbivore', 'Grass');
$lion = new Lion('Carnivore', 'Meat');
echo '<b>Cow Object</b> <br>';
echo 'The Cow belongs to the ' . $cow->get_family() . ' family and eats ' . $cow->get_food() . '<br><br>';
echo '<b>Lion Object</b> <br>';
echo 'The Lion belongs to the ' . $lion->get_family() . ' family and eats ' . $lion->get_food();
?>

アプリケーションをテストする

それでは、ウェブブラウザでアプリケーションを表示してみましょう。

PHPでの継承

どちらのオブジェクトも、Animalクラスから継承したget_familyメソッドとget_foodメソッドを再利用しており、これは継承の実際の動作を示している。

PHPでポリモーフィズムを実装する方法

例えば、次のようなさまざまなデータベースエンジンに接続するアプリケーションを開発したいとしましょう。 MySQL (NAIST) と SQL サーバーですが、同じ統一インターフェースを使用します。標準メソッドと絶対値を定義するインターフェースを作成できます。trac共通メソッドを実装するクラス。

  • インタフェース – クラスに似ています。 メソッドとパラメータのみを定義します。
  • 腹筋tractクラス – オブジェクトを直接作成するために使用できないクラスです。 その目的は、一般的なメソッドの部分的または全体の実装を提供することです。

以下のクラス図は、私たちのabs間の関係を示していますtractクラス、インターフェース、および実装クラス。

PHPでの継承

それでは腹筋を作りましょうtractクラス。

<?php
abstract class DBCommonMethods
{
    private $host;
    private $db;
    private $uid;
    private $password;
    public function __construct($host, $db, $uid, $password)
    {
        $this->host = $host;
        $this->db = $db;
        $this->uid = $uid;
        $this->password = $password;
    }
}
?>

ここに、

  • 「腹筋trac「tクラス」とは、そのクラスを直接使用してオブジェクトを作成することはできないという意味です。
  • 「$host、$db…」は、すべての実装に共通するクラス変数です。
  • 「function __construct(…)」は、初期化時に共通変数の値を設定するクラスコンストラクタメソッドです。

それでは、データベースエンジンによって実装方法が異なる標準メソッドを含むインターフェースを作成しましょう。

<?php
interface DBInterface
{
    public function db_connect();
    public function insert($data);
    public function read($where);
    public function update($where);
    public function delete($where);
}
?>

ここに、

  • 「インターフェース」はインターフェースを作るためのキーワードです
  • 「public function…(…)」は実装すべき標準メソッドです

それでは、DBCommonMethods クラスを拡張し、DBInterface インターフェイスを実装する具体的なクラスを作成しましょう。まず、 MySQLDriver.php:

<?php
class MySQLDriver extends DBCommonMethods implements DBInterface
{
    public function __construct($host, $db, $uid, $password)
    {
        parent::__construct($host, $db, $uid, $password);
    }
    public function db_connect() { /* connect code goes here */ }
    public function delete($where) { /* delete code goes here */ }
    public function insert($data)  { /* insert code goes here */ }
    public function read($where)   { /* read code goes here */ }
    public function update($where) { /* update code goes here */ }
}
?>

次に、MSSQLServerDriver.php:

<?php
class MSSQLServerDriver extends DBCommonMethods implements DBInterface
{
    public function __construct($host, $db, $uid, $password)
    {
        parent::__construct($host, $db, $uid, $password);
    }
    public function db_connect() { /* connect code goes here */ }
    public function delete($where) { /* delete code goes here */ }
    public function insert($data)  { /* insert code goes here */ }
    public function read($where)   { /* read code goes here */ }
    public function update($where) { /* update code goes here */ }
}
?>

ここに、

  • 「クラス … は DBCommonMethods を拡張する」は、DBCommonMethods のメソッドを使用します。
  • 「…DBInterfaceを実装する」は、使用するデータベースドライバに関係なく、クラスが標準メソッドを提供することを保証します。

上記のクラスを使用したコードは次のようになります。

<?php $db = new MySQLDriver($host, $db, $uid, $password); ?>

または:

<?php $db = new MSSQLServerDriver($host, $db, $uid, $password); ?>

残りのコードは両方のドライバーで同じで、例えば次のようになります。

<?php
$db->db_connect();
$db->insert($data);
?>

これはポリモーフィズムの実例です。同じメソッド呼び出しは、インターフェースを実装するどのドライバでも機能するため、データベースエンジンを切り替えても、周辺のコードは一切変更されません。

よくあるご質問

腹筋tracクラスは実装されたメソッドとプロパティの両方を保持できますが、クラスは 1 つしか継承しません。インターフェースはメソッドのシグネチャのみを宣言し、クラスは多くのメソッドを実装できます。tracコードを共有するためのtクラス、制約を強制するためのインターフェースtract.

4つの柱は、カプセル化、継承、ポリモーフィズム、およびabsです。tracこのチュートリアルでは最初の 3 つに焦点を当てます。traction は、PHP が abs でサポートするシンプルなインターフェースの背後に複雑な詳細を隠します。tractクラスとインターフェース。

パブリックメンバーはどこからでもアクセス可能で、プライベートメンバーは同じクラス内でのみアクセス可能、プロテクトメンバーはクラスとそのサブクラス内でのみアクセス可能です。これらは、各プロパティやメソッドの読み取りや変更を誰が行えるかを制御することで、カプセル化を強制します。

はい。AIにフィールドまたはテーブル定義を与えれば、型付きプロパティ、コンストラクタ、getメソッドとsetメソッドを備えたクラスを生成できます。 Revクラスを使用する前に、型を確認し、検証を追加してください。

はい。プロシージャルスクリプトを貼り付けると、AIが関連する関数とデータをクラスにグループ化し、カプセル化を適用し、継承またはインターフェースを提案します。動作は変更されないはずなので、リファクタリング後のコードをテストしてください。