【 PHP 】PHP8に入門してみた 205日目 PHPの基本 ( オブジェクト指向 無名クラス)

PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。

オブジェクト指向

名もない処理・・・ 無名クラス

無名クラスとは、クラス名を持たずに直接インスタンス化できるクラスのことです。

無名クラスを使うといろいろ便利なことがあります。

  1. 一時的なオブジェクトを生成する場合に便利
    無名クラスは、クラス名を定義する必要がないため一時的にオブジェクトを生成する場合に便利です。
    たとえば、コールバック関数内で使用する場合や、短時間だけ必要なオブジェクトを生成する場合に適しています。
  2. クラス定義を隠蔽することができる
    無名クラスを使用することでクラス定義を外部から隠蔽することができます。
    つまり、使用者がクラス名を知らなくても、そのクラスのインスタンスを生成して利用することができます。
    これにより、コードの抽象度を高めることができます。
  3. ファクトリーメソッドの戻り値として利用できる
    無名クラスは、ファクトリーメソッドの戻り値として利用することができます。たとえば、ファクトリーメソッド内で無名クラスを定義し、そのインスタンスを生成して返すことができます。以上のように、無名クラスは一時的なオブジェクト生成やクラス定義の隠蔽、ファクトリーメソッドの戻り値など、様々な場面で利用することができます。

基本

<!DOCTYPE html>

<html>


<head>
    <meta charset="UTF-8" />
    <title>こんにちは!</title>
    <!-- Bootstrapを有効化 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
</head>

<body>
    <?php
    $instance = new class
    {
        // 無名クラスのプロパティやメソッドを定義
        public function hello()
        {
            return "Hello, world!";
        }
    };

    print($instance->hello()); // "Hello, world!"と出力される

    ?>
</body>

</html>

上記のコードでは、new class {...}という文で無名クラスを定義し、そのインスタンスを$instance変数に代入しています。hello()メソッドは無名クラスのメソッドであり、$instanceオブジェクトから呼び出すことができます。

応用

無名クラスは通常のクラスと同様に継承したり、インターフェースを実装したりすることができるようです。

<!DOCTYPE html>

<html>


<head>
    <meta charset="UTF-8" />
    <title>こんにちは!</title>
    <!-- Bootstrapを有効化 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
</head>

<body>
    <?php
    class ParentClass
    {
        public function greet()
        {
            return "Hello";
        }
    }

    $instance = new class extends ParentClass
    {
        public function hello()
        {
            return $this->greet() . ", world!";
        }
    };

    print($instance->hello()); // "Hello, world!"と出力される


    ?>
</body>

</html>

 

 

メモ

ファクトリーメソッドとは、オブジェクトを生成するためのメソッドのこと。

一般的には、クラスのコンストラクターを直接呼び出す代わりに、ファクトリーメソッドを使用してオブジェクトを生成します。

ファクトリーメソッドは、オブジェクト生成時に様々な処理を実行することができます。
たとえば、オブジェクトの初期化処理や、キャッシュの確認などを行うことができます。
また、ファクトリーメソッドを使用することで、生成するオブジェクトの型を動的に変更することもできます。

<!DOCTYPE html>

<html>


<head>
    <meta charset="UTF-8" />
    <title>こんにちは!</title>
    <!-- Bootstrapを有効化 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
</head>

<body>
    <?php
    class Product
    {
        public $name;
        public $price;

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

    class ProductFactory
    {
        public static function create($name, $price)
        {
            return new Product($name, $price);
        }
    }

    // ファクトリーメソッドを使用してオブジェクトを生成する
    $product = ProductFactory::create('apple', 100);

    print($product->name); // apple
    print($product->price); // 100



    ?>
</body>

</html>

Productクラスのインスタンスを生成するためのファクトリーメソッドcreateを定義しています。

このメソッドは、Productクラスのコンストラクターを呼び出して、新しいインスタンスを生成しています。
ProductFactoryクラスは、ファクトリーとしての役割を担い、Productクラスの生成処理を抽象化しています。

でも・・・戻ってくるクラスどんなプロパティ使えてどんなメソッドを実装しているのかわからないような気がするんですよね。

PHPPHP

Posted by raika@blog