Menu
Coddy logo textTech

__get、__set、__isset、__unset

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 46/91。

PHP には、プロパティへのアクセスをインターセプトする4つのマジックメソッドがあります:__get()__set()__isset()__unset()。これらは、exist しない、またはアクセスできないプロパティにアクセスしようとしたときに呼び出されます。

__get() メソッドはアクセスできないプロパティを読み取るときに呼び出され、一方、__set() はプロパティへの書き込みを処理します。これにより、動的なプロパティを作成したり、プロパティにアクセスしたときにロジックを追加したりできます。

<?php
class DynamicObject {
    private array $data = [];
    
    public function __get(string $name): mixed {
        return $this->data[$name] ?? null;
    }
    
    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
}

$obj = new DynamicObject();
$obj->title = "Hello";
$obj->count = 42;
echo $obj->title . " - " . $obj->count;

出力:

Hello - 42

__isset() メソッドは isset() または empty() によって呼び出され、__unset()unset() 関数に応答します。

<?php
class DynamicObject {
    private array $data = [];
    
    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }
    
    public function __isset(string $name): bool {
        return isset($this->data[$name]);
    }
    
    public function __unset(string $name): void {
        unset($this->data[$name]);
    }
}

$obj = new DynamicObject();
$obj->name = "Test";
echo isset($obj->name) ? "exists" : "missing";

出力:

exists

これらのメソッドは、柔軟なデータコンテナーの作成、遅延読み込みの実装、またはオブジェクト指向の構造を維持しながら配列のように動作するオブジェクトの構築によく使用されます。

challenge icon

チャレンジ

簡単

magic methods を使用して設定を動的に保存する、柔軟な configuration manager を構築しましょう。クラスはプロパティへのアクセスをインターセプトして configuration の値を管理し、設定が存在するか確認し、必要に応じて削除します。各プロパティを明示的に定義する必要はありません。

コードを2つのファイルに分けて整理します。

  • Config.php: configuration の値を内部的に保存する private array を使用する Config class を Create します。4つすべてのプロパティ magic methods を Implement してください。
    • __get($name): given key の値を Return します。key が exist しない場合は "undefined" を Return します
    • __set($name, $value): given key の下に値を保存します
    • __isset($name): configuration 内に key が exists するかどうかを Return します
    • __unset($name): configuration から key を remove します
    また、保存された設定の number を Return する count() method も追加します。
  • main.php: Config file を include します。3つの inputs、つまり設定名、設定値、second setting name を受け取ります。Config instance を Create し、次の operations を実行します。
    • first setting を given value に設定する
    • isset() を使用して first setting が exists するかどうかを Print する。出力は "exists" または "missing"
    • first setting の値を Print する
    • settings の current count を Print する
    • unset() を使用して first setting を remove する
    • first setting が now exists するかどうかを Print する。出力は "exists" または "missing"
    • second setting の値を Print する(これは never set されていません)

各出力はそれぞれ別の行に表示してください。magic methods によって、実際のプロパティが定義されていない場合でも、$config->theme = "dark"isset($config->theme) のような自然なプロパティ構文を使用して Config object とやり取りできます。

REQUIRED OUTPUT FORMAT: [Your translated content here]

自分で試してみよう

<?php

require_once 'Config.php';

// 入力を読み取る
$settingName1 = trim(fgets(STDIN));
$settingValue = trim(fgets(STDIN));
$settingName2 = trim(fgets(STDIN));

// TODO: Config のインスタンスを作成する

// TODO: 最初の設定を指定された値に設定する

// TODO: 最初の設定が存在するかどうかを出力する ("exists" または "missing")

// TODO: 最初の設定の値を出力する

// TODO: 現在の設定の数を出力する

// TODO: unset() を使用して最初の設定を削除する

// TODO: 最初の設定が現在存在するかどうかを出力する ("exists" または "missing")

// TODO: 2番目の設定の値を出力する(一度も設定されていない)

?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: PHPオンラインコンパイラ