オブジェクト指向プログラミング(OOP)のPHPでの実装
オブジェクト指向の概念
オブジェクト指向プログラミング(OOP)は、アプリケーションやソフトウェアを「オブジェクト」を使って設計するプログラミングパラダイムです。これらのオブジェクトは、クラスのインスタンスで、データをフィールド(属性とも呼ばれる)として保持し、コードを手続き(メソッドとも呼ば)として保持します。OOPの主要な原則は、カプセル化、継承、ポリモーフィズムです。
PHPでのクラスの定義
PHPでは、class
キーワードを使ってクラスを定義します。クラスは、同一タイプのすべてのオブジェクトに共通するプロパティとメソッドを定義する蓝图です。
class Car {
// クラスのプロパティとメソッドをここに記述
}
PHPでのオブジェクトの生成
クラスからオブジェクトを作成するには、new
キーワードに続けてクラス名を使用します。
$myCar = new Car();
メンバ関数の呼び出し
メンバ関数はクラス内で定義され、オブジェクトのプロパティに対して操作を行うために使用されます。オブジェクトのメンバ関数を呼び出すには、オブジェクト演算子->
を使用します。
$myCar->drive(); // $myCarオブジェクトのdriveメソッドを呼び出す
コンストラクタ関数
コンストラクタは、クラスからオブジェクトが作成されたときに自動的に呼び出される特別なメソッドで、オブジェクトのプロパティを初期化するために使用されます。
class Car {
public function __construct() {
// プロパティを初期化するここに記述
}
}
デストラクタ
デストラクタは、オブジェクトが破壊されたりスコープから外れたときに自動的に呼び出される特別なメソッドで、データベース接続を閉じたりメモリを解放するなどのクリーンアップタスクを行うために使用されます。
class Car {
public function __destruct() {
// クリーンアップタスクをここに記述
}
}
継承
継承により、クラスは他のクラスからプロパティとメソッドを継承することができます。継承されるクラスは親クラスと呼ばれ、継承するクラスは子クラスと呼ばれます。
class ElectricCar extends Car {
// ElectricCarはCarからプロパティとメソッドを継承します
}
関数のオーバーライド
関数のオーバーライドにより、子クラスは親クラスで既に定義されているメソッドに対して異なる実装を提供することができます。
class ElectricCar extends Car {
public function drive() {
// driveメソッドの異なる実装
}
}
パブリックメンバー
パブリックメンバーは、クラスの内外からアクセス可能です。
class Car {
public $color; // パブリックプロパティ
public function drive() { // パブリックメソッド
// コードをここに記述
}
}
プライベートメンバー
プライベートメンバーは、定義されたクラス内でのみアクセス可能で、クラスの外からはアクセスできません。
class Car {
private $color; // プライベートプロパティ
private function drive() { // プライベートメソッド
// コードをここに記述
}
}
プロテクテッドメンバー
プロテクテッドメンバーは、定義されたクラス内およびそのサブクラス内でアクセス可能です。
class Car {
protected $color; // プロテクテッドプロパティ
protected function drive() { // プロテクテッドメソッド
// コードをここに記述
}
}
インターフェース
インターフェースは、クラスが実装する必要があるメソッドのセットを定義する契約です。クラスがインターフェースを実装すると、インターフェースに宣言されたすべてのメソッドの実装を提供することを約束します。
interface Drivable {
public function drive(); // メソッドの宣言
}
class Car implements Drivable {
public function drive() {
// driveメソッドの実装
}
}
定数
定数は、一度定義されると変更できない名前付きの値で、プログラムの実行中に変更されるべきでない値を定義するのに便利です。
class Car {
const MAX_SPEED = 100; // 定数値
}
抽象クラス
抽象クラスは、インスタンス化できないクラスで、他のクラスによって継承されることを意図しています。抽象クラスは、実装がない抽象メソッドと実装のある具体メソッドを含むことができます。
abstract class Vehicle {
abstract public function move(); // 抽象メソッド
public function stop() { // 具体メソッド
// コードをここに記述
}
}
ステティックキーワード
ステティックキーワードは、プロパティやメソッドをクラス自体に関連付けるために使用され、オブジェクトを作成することなくアクセスできます。
class Car {
public static $count = 0; // ステティックプロパティ
public static function getCount() { // ステティックメソッド
return self::$count;
}
}
ファイナルキーワード
ファイナルキーワードは、クラスが拡張されることを防ぐか、メソッドがオーバーライドされることを防ぐために使用されます。
final class Car {
// このクラスは拡張できません
}
親コンストラクタの呼び出し
子クラスを作成する際に、親クラスのコンストラクタを呼び出して親クラスのプロパティを初期化したい場合があります。親クラスのコンストラクタを呼び出すには、parent
キーワードに続けて::
演算子とコンストラクタ名を使用します。
class ElectricCar extends Car {
public function __construct() {
parent::__construct(); // 親コンストラクタを呼び出す
// 追加の初期化をここに記述
}
}
Credits: Image by storyset