【 PHP 】PHP8に入門してみた 214日目 PHPの基本 ( オブジェクト指向 マジックメソッド)

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

オブジェクト指向

マジック!

PHPには、オブジェクト指向プログラミングにおいて便利な機能として「マジックメソッド」と呼ばれる特殊なメソッドがいくつかあるようです。
以下に代表的なマジックメソッドをいくつか紹介します。

  1. __construct():
    オブジェクトが生成された時に自動的に呼び出されるメソッドです。
    オブジェクトの初期化や設定を行います。
  2. __destruct(): オブジェクトが破棄される直前に自動的に呼び出されるメソッドです。
    リソースの解放やクリーンアップ処理を行います。
  3. __get():
    オブジェクトのプロパティにアクセスしようとした際に、存在しないプロパティに対して自動的に呼び出されるメソッドです。
    プロパティを動的に生成するために使用します。
  4. __set():
    オブジェクトのプロパティに値を設定しようとした際に、存在しないプロパティに対して自動的に呼び出されるメソッドです。
    __get()と同じく、プロパティを動的に生成して値を設定するために使用します。
  5. __call():
    存在しないメソッドが呼び出された際に自動的に呼び出されるメソッドです。
    こちらも動的にメソッドを生成するために使用します。
  6. __toString():
    オブジェクトを文字列に変換する際に自動的に呼び出されるメソッドです。
    オブジェクトの内容を文字列に変換するために使用します。
<!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 MyClass
    {
        private $data = array();

        public function __set($name, $value)
        {
            $this->data[$name] = $value;
        }

        public function __get($name)
        {
            if (array_key_exists($name, $this->data)) {
                return $this->data[$name];
            } else {
                return null;
            }
        }
    }

    $obj = new MyClass();
    $obj->name = "John"; // __set()メソッドが呼び出される
    echo $obj->name;     // __get()メソッドが呼び出される

    ?>
</body>

</html>

 

過剰な使用は禁物

マジックメソッドは、オブジェクト指向プログラミングにおいて非常に便利な機能ですが、過剰に使用するとコードの可読性が低下する場合があるため
適切な使い方を心がける必要があります。

メモ

プロパティ名(キー名)にハイフンは使えない

PHPのプロパティ名には、アルファベット、数字、アンダースコア(_)が使用できますが、ハイフン(-)は使用できません。
なので・・・__setが呼び出され、動的に変数を生成する際、パラメータに「ハイフン」が存在する場合は別の文字で置き換えたる必要があるようです。

<!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 MyClass
    {
        private $data = array();

        public function __set($name, $value)
        {
            $this->data[str_replace('-', '_', $name)] = $value; // ★ここでハイフンをアンダースコアに。
        }

        public function __get($name)
        {
            if (array_key_exists(str_replace('-', '_', $name), $this->data)) {
                return $this->data[str_replace('-', '_', $name)]; // ★ここでハイフンをアンダースコアに。
            } else {
                return null;
            }
        }
    }

    $obj = new MyClass();
    $obj->{'my-property'} = "value"; // __set()メソッドが呼び出される
    echo $obj->{'my-property'};      // __get()メソッドが呼び出される


    ?>
</body>

</html>

 

プロパティ名にハイフンを使用するのは非推奨です。アンダースコアを使用するか、キャメルケースにするなどの命名規則を守ること!

 

PHPPHP

Posted by raika@blog