オブジェクト指向プログラミング(OOP)は、プログラムを「オブジェクト」という単位に分割して管理するプログラミングの手法です。PHPにおいても、OOPを使用することで、再利用性が高く、保守しやすいコードを構築することが可能です。本章では、クラスとオブジェクトの基礎から始まり、継承、抽象クラス、インターフェース、多態性、さらに名前空間とオートロードまでを解説します。
クラスの定義とオブジェクト生成
PHPにおけるクラスは、データとそれを操作するメソッドをまとめた設計図のようなもので、オブジェクトはこのクラスから生成された具体的な「インスタンス」を指します。まずはクラスの基本的な定義方法から確認していきましょう。
PHPのクラスは class キーワードを用いて定義します。クラスの内部には、データを保持する「プロパティ」と、データを操作する「メソッド」を定義します。以下は、シンプルなクラスの例です。
class Car
{
public $color;
public $model;
public function __construct($color, $model)
{
$this->color = $color;
$this->model = $model;
}
public function drive()
{
echo "The {$this->color} {$this->model} is driving.";
}
}
この Car クラスには、color と model の2つのプロパティが定義されており、__construct メソッドで初期化されます。また、drive というメソッドは、この車が「走行中」であることを示すメッセージを出力します。
オブジェクトを生成するには、new キーワードを使います。
$car = new Car("red", "Toyota");
$car->drive();
上記のコードでは、Car クラスから $car というオブジェクトを生成し、drive メソッドを呼び出しています。これにより、次のような出力が表示されます。
The red Toyota is driving.
プロパティとメソッド
プロパティはクラス内部で保持されるデータのことで、クラス内で変数として定義されます。PHPでは、プロパティには public、protected、private のアクセス修飾子を設定することができ、アクセスの範囲を制御できます。
public:どこからでもアクセス可能protected:クラス自身と継承クラスからのみアクセス可能private:そのクラスからのみアクセス可能メソッドはクラスの内部で定義される関数で、オブジェクトに関連した動作を実行します。以下の例では、プロパティにアクセスするためのメソッドを追加しています。
class Car
{
private $color;
private $model;
public function __construct($color, $model)
{
$this->color = $color;
$this->model = $model;
}
public function getColor()
{
return $this->color;
}
public function getModel()
{
return $this->model;
}
}
$car = new Car("blue", "Honda");
echo "The car model is: " . $car->getModel();
オブジェクト指向プログラミングでは、「継承」という機能を用いることで、既存のクラスを基に新しいクラスを作成できます。PHPで継承を行う場合は extends キーワードを使用します。
クラスの継承とその応用
継承を利用すると、既存のクラスの機能を再利用しながら、新たな機能を追加できます。たとえば、Car クラスを継承して特定の種類の車、例えばスポーツカーを定義する場合を見てみましょう。
class Car
{
protected $color;
protected $model;
public function __construct($color, $model)
{
$this->color = $color;
$this->model = $model;
}
public function drive()
{
echo "The {$this->color} {$this->model} is driving.";
}
}
class SportsCar extends Car
{
private $maxSpeed;
public function __construct($color, $model, $maxSpeed)
{
parent::__construct($color, $model);
$this->maxSpeed = $maxSpeed;
}
public function showSpeed()
{
echo "This sports car can go up to {$this->maxSpeed} km/h.";
}
}
$sportsCar = new SportsCar("red", "Ferrari", 300);
$sportsCar->drive();
$sportsCar->showSpeed();
ここでは、SportsCar クラスが Car クラスを継承し、maxSpeed という新しいプロパティと showSpeed メソッドを追加しています。parent::__construct() を使用して、親クラスで定義されたコンストラクタを呼び出し、基本的な初期化を行っています。
抽象クラス、インターフェース、多態性の活用
PHPでは、クラスの構造をより柔軟にするために、抽象クラスとインターフェースが使用できます。
abstract class Vehicle { abstract public function drive(); } class Car extends Vehicle { public function drive() { echo "The car is driving."; } } $car = new Car(); $car->drive();interface Drivable { public function drive(); } class Car implements Drivable { public function drive() { echo "The car is driving."; } } $car = new Car(); $car->drive();class Motorcycle extends Vehicle { public function drive() { echo "The motorcycle is driving."; } } function startDrive(Drivable $vehicle) { $vehicle->drive(); } $car = new Car(); $motorcycle = new Motorcycle(); startDrive($car); startDrive($motorcycle);大規模なプロジェクトでは、クラスの名前が他の部分と競合しないようにするために「名前空間」が必要になります。PHPでは、namespace キーワードを使用して名前空間を定義します。
名前空間の使い方と管理
namespace Vehicles;
class Car
{
public function drive()
{
echo "The car is driving.";
}
}
$car = new \Vehicles\Car();
$car->drive();
オートロードでファイルを自動的に読み込む方法
オートロードとは、必要なクラスが呼び出された際に自動的にファイルを読み込む仕組みです。PHPには spl_autoload_register() 関数が用意されており、これを使用してクラスのオートロードを設定できます。
spl_autoload_register(function ($class) {
require_once __DIR__ . '/' . str_replace('\\', '/', $class) . '.php';
});
$car = new \Vehicles\Car();
$car->drive();