【PHP】クラスとインスタンスの使い方と活用法5選 – Japanシーモア

【PHP】クラスとインスタンスの使い方と活用法5選

PHPのクラスとインスタンスの使い方と活用法PHP
この記事は約16分で読めます。

 

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

このサービスは複数のSSPによる協力の下、運営されています。

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

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

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

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

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

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

はじめに

この記事を読むことで、PHPにおけるクラスとインスタンスの基本的な使い方や活用法について理解することができるようになります。

初めてPHPを学ぶ方でも安心して進められるよう、具体的なサンプルコードと共にわかりやすく解説していきます。

クラスとインスタンスを使いこなすことで、あなたのPHPプログラミングは更にパワーアップします。

●PHPにおけるクラスとは

○クラスの基本

クラスとは、オブジェクト指向プログラミングにおける中心的な概念で、関連するデータ(プロパティ)とそれを操作する手続き(メソッド)をまとめたものを指します。

これにより、同じような動きをするものをひとまとめにして管理することができ、コードの再利用や保守性を向上させます。

PHPでのクラスの宣言は、次のように行います。

class MyClass {
    // プロパティの宣言
    public $prop1 = "I'm a class property!";

    // メソッドの宣言
    public function setProperty($newval) {
        $this->prop1 = $newval;
    }

    public function getProperty() {
        return $this->prop1 . "\n";
    }
}

このコードでは、MyClassという名前のクラスを宣言しています。

この例では、$prop1というプロパティと、setPropertygetPropertyという2つのメソッドを持っています。

●PHPにおけるインスタンスとは

○インスタンスの基本

インスタンスとは、クラスから生成される実体のことを指します。

クラスは設計図のようなもので、その設計図から具体的なオブジェクトを作り出すのがインスタンスです。

インスタンスを生成することで、クラスに定義されたプロパティやメソッドを使用することができます。

PHPでのインスタンス生成は、newキーワードを使用して行います。

$obj = new MyClass;

このコードでは、MyClassというクラスから新しいインスタンスを生成し、それを$objという変数に代入しています。

これにより、$objを通じてクラスに定義されたメソッドやプロパティを利用することが可能になります。

●PHPにおけるインスタンスとは

○インスタンスの基本

クラスが設計図であるならば、インスタンスはその設計図から作り出された具体的なオブジェクトのことを指します。

インスタンスを生成することで、クラスに定義されたプロパティやメソッドを使用することができます。

PHPでのインスタンス生成は、次のようにnewキーワードを使用して行います。

$obj = new MyClass;

このコードでは、MyClassというクラスから新しいインスタンスを生成し、それを$objという変数に代入します。

これにより、$objを通じてクラスに定義されたメソッドやプロパティを利用することが可能になります。

●クラスとインスタンスの使い方

○サンプルコード1:クラスとインスタンスの基本的な使い方

PHPにおけるクラスとインスタンスの基本的な使い方を次のサンプルコードで確認しましょう。

class Car {
    public $color;

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

    public function getColor() {
        return $this->color;
    }
}

$myCar = new Car("red");
echo $myCar->getColor(); // "red"が出力されます

このコードでは、Carというクラスを作成し、そのクラスに$colorというプロパティとgetColorというメソッドを定義しています。

また、__constructという特殊なメソッド(コンストラクタ)を使って、インスタンス生成時に$colorプロパティを初期化しています。

その後、newキーワードを用いてCarクラスから新しいインスタンス$myCarを生成し、そのインスタンスのgetColorメソッドを呼び出しています。

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

クラスのメソッドとプロパティの利用方法を次のサンプルコードで確認します。

class Rectangle {
    public $width;
    public $height;

    public function __construct($width, $height) {
        $this->width = $width;
        $this->height = $height;
    }

    public function getArea() {
        return $this->width * $this->height;
    }
}

$myRectangle = new Rectangle(5, 10);
echo $myRectangle->getArea(); // 50が出力されます

このコードでは、Rectangleというクラスを作成し、そのクラスに$width$heightというプロパティとgetAreaというメソッドを定義しています。

その後、newキーワードを用いてRectangleクラスから新しいインスタンス$myRectangleを生成し、そのインスタンスのgetAreaメソッドを呼び出しています。

ここで、getAreaメソッドはプロパティの$width$heightを掛け合わせて面積を計算しています。

○サンプルコード3:クラスの継承とオーバーライド

クラスの継承とオーバーライドの方法を次のサンプルコードで確認します。

class Vehicle {
    public $color;

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

    public function getColor() {
        return $this->color;
    }
}

class Car extends Vehicle {
    public $doors;

    public function __construct($color, $doors) {
        parent::__construct($color);
        $this->doors = $doors;
    }

    public function getDetails() {
        return $this->color . " color and " . $this->doors . " doors";
    }
}

$myCar = new Car("red", 4);
echo $myCar->getDetails(); // "red color and 4 doors"が出力されます

このコードでは、Vehicleという基底クラスを作成し、その後でVehicleクラスを継承したCarという派生クラスを作成しています。

Carクラスでは、基底クラスの$colorプロパティとは別に$doorsという新しいプロパティを定義し、そのプロパティを使った新しいメソッドgetDetailsを追加しています。

また、コンストラクタで基底クラスのコンストラクタをparent::__constructで呼び出すことで、$colorプロパティの初期化を行っています。

○サンプルコード4:抽象クラスとインターフェースの利用

抽象クラスとインターフェースの利用方法を次のサンプルコードで確認します。

abstract class Animal {
    abstract public function makeSound();
}

interface Walkable {
    public function walk();
}

class Dog extends Animal implements Walkable {
    public function makeSound() {
        echo "Woof!\n";
    }

    public function walk() {
        echo "The dog is walking.\n";
    }
}

$myDog = new Dog();
$myDog->makeSound(); // Woof!が出力されます
$myDog->walk(); // The dog is walking.が出力されます

このコードでは、抽象クラスAnimalとインターフェースWalkableを作成し、それを継承・実装する具象クラスDogを定義しています。

抽象クラスは一つ以上の抽象メソッド(ここではmakeSound)を持ち、その具体的な実装は子クラスに任せる特性を持ちます。

インターフェースは全てのメソッドが抽象メソッドであり、それを実装するクラスはインターフェースで定義された全てのメソッドの具体的な実装を提供しなければなりません(ここではwalk)。

○サンプルコード5:トレイトの利用

トレイトの利用方法を次のサンプルコードで確認します。

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello(); // Hello World!が出力されます

このコードでは、SayWorldというトレイトを作成し、そのトレイトをMyHelloWorldクラスで使用しています。

トレイトは再利用可能なコード片を表現するためのもので、クラスの中でuseキーワードと共に使われます。

この例では、sayHelloメソッドがトレイトによってオーバーライドされ、その中でparent::sayHelloが呼び出されて元のメッセージとトレイトからのメッセージが連結されて出力されます。

●クラスとインスタンスの応用例

ここからは、以上で学んだクラスとインスタンスの基本的な使い方を基に、具体的な応用例を示します。

それぞれのサンプルコードは一つのクラスや概念に焦点を当て、その使い方を紹介します。

○サンプルコード6:ユーザークラスの作成と利用

ユーザークラスを作成し、そのインスタンスを利用する方法を次のサンプルコードで確認します。

class User {
    public $name;
    public $email;

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

    public function sayHello() {
        echo "こんにちは、{$this->name}さん\n";
    }
}

$user = new User("田中", "tanaka@example.com");
echo $user->name;  // 田中
echo $user->email; // tanaka@example.com
$user->sayHello(); // こんにちは、田中さん

このコードでは、ユーザークラスを使ってユーザーの名前とメールアドレスを管理しています。

この例では、コンストラクタを使用してインスタンス生成時に名前とメールアドレスを設定し、それらを公開プロパティで保持します。

また、sayHelloというメソッドを使ってユーザーの名前を使用したメッセージを出力しています。

○サンプルコード7:商品クラスとカートクラスの利用

商品クラスとカートクラスを作成し、それらのインスタンスを利用する方法を次のサンプルコードで確認します。

class Product {
    public $name;
    public $price;

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

class Cart {
    private $items = [];

    public function addProduct(Product $product) {
        $this->items[] = $product;
    }

    public function getTotal() {
        $total = 0;
        foreach ($this->items as $item) {
            $total += $item->price;
        }
        return $total;
    }
}

$product1 = new Product("りんご", 100);
$product2 = new Product("バナナ", 200);

$cart = new Cart();
$cart->addProduct($product1);
$cart->addProduct($product2);

echo $cart->getTotal(); // 300

このコードでは、商品クラスを使って商品の名前と価格を管理し、カートクラスを使って複数の商品を管理しています。

この例では、addProductメソッドを使ってカートに商品を追加し、getTotalメソッドを使ってカート内の全商品の合計金額を計算しています。

○サンプルコード8:データベース接続クラスの作成と利用

データベース接続クラスを作成し、そのインスタンスを利用する方法を次のサンプルコードで確認します。

class Database {
    private $connection;

    public function __construct($hostname, $username, $password, $database) {
        $this->connection = new mysqli($hostname, $username, $password, $database);
        if ($this->connection->connect_error) {
            die("データベース接続エラー: " . $this->connection->connect_error);
        }
    }

    public function query($sql) {
        $result = $this->connection->query($sql);
        if ($this->connection->error) {
            die("クエリエラー: " . $this->connection->error);
        }
        return $result;
    }

    public function close() {
        $this->connection->close();
    }
}

$db = new Database('localhost', 'username', 'password', 'database');
$result = $db->query("SELECT * FROM users");
$db->close();

このコードでは、データベース接続クラスを使ってデータベースへの接続とクエリの実行を行います。

この例では、コンストラクタでデータベースへの接続を確立し、queryメソッドでSQL文をデータベースに送信し、closeメソッドでデータベースから切断します。

○サンプルコード9:例外処理クラスの作成と利用

例外処理クラスを作成し、そのインスタンスを利用する方法を次のサンプルコードで確認します。

class CustomException extends Exception {
    public function errorMessage() {
        $errorMsg = 'エラー on line '.$this->getLine().' in '.$this->getFile()
        .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
        return $errorMsg;
    }
}

$email = "example_at_example_dot_com";

try {
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
        throw new CustomException($email);
    }
} catch (CustomException $e) {
    echo $e->errorMessage();
}

このコードでは、例外処理クラスを使って特定のエラーに対するカスタムメッセージを提供します。

この例では、CustomExceptionクラスを定義し、そのクラスにはエラーメッセージを生成するメソッドを提供しています。

不適切なメールアドレスが検出された場合、このカスタム例外がスローされ、エラーメッセージが出力されます。

○サンプルコード10:APIリクエストクラスの作成と利用

APIリクエストクラスを作成し、そのインスタンスを利用する方法を次のサンプルコードで確認します。

class ApiRequest {
    private $baseUrl;

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

    public function get($endpoint) {
        $ch = curl_init($this->baseUrl . $endpoint);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        curl_close($ch);
        return json_decode($response);
    }
}

$apiRequest = new ApiRequest('https://example.com/api/');
$response = $apiRequest->get('users');

このコードでは、ApiRequestというクラスを使って外部APIからデータを取得します。

この例では、コンストラクタで基本となるURLを設定し、getメソッドで指定したエンドポイントからデータを取得します。

このgetメソッドは、PHPのcURL機能を使ってHTTP GETリクエストを送信し、取得したデータをJSON形式からPHPのオブジェクトに変換して返します。

●注意点と対処法

以上のサンプルコードは、実際のプログラムでクラスとインスタンスを利用する際の参考例です。

ただし、実際の開発では次のような注意点があります。

  1. エラーハンドリング:上記のコードではエラーハンドリングが省略されています。
    実際のコードでは、データベース接続失敗、APIリクエスト失敗などの可能性を考慮し、適切なエラーハンドリングを行う必要があります。
  2. セキュリティ:例えばデータベースのパスワードやAPIのキーなど、セキュリティに関わる情報は直接コードに書かず、環境変数などから取得するようにしましょう。
  3. コードの再利用:クラスとメソッドをうまく設計することで、コードの再利用性を高め、メンテナンスを容易にすることができます。

まとめ

クラスとインスタンスの利用は、コードの整理、再利用、拡張性向上に大いに貢献します。

上記のサンプルコードはその一例であり、自身のプロジェクトに合わせて適切にクラス設計を行うことが重要です。

また、エラーハンドリングやセキュリティへの配慮も忘れずに行いましょう。