Menu
Coddy logo textTech

__get, __set, __isset, __unset

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 46번째.

PHP는 속성 접근을 가로채는 네 가지 magic method를 제공합니다: __get(), __set(), __isset(), __unset(). 이러한 method는 존재하지 않거나 접근할 수 없는 속성에 액세스하려고 할 때 트리거됩니다.

접근할 수 없는 속성을 읽을 때 __get() method가 호출되고, __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() function에 응답합니다:

<?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

이러한 메서드는 유연한 데이터 컨테이너를 생성하고, 지연 로딩을 implement하거나, 객체 지향 구조를 유지하면서 array처럼 동작하는 객체를 구축하는 데 흔히 사용됩니다.

challenge icon

챌린지

쉬움

magic method를 사용하여 설정을 동적으로 저장하는 유연한 configuration 관리자를 만들어 봅시다. 여러분의 class는 property 접근을 가로채 configuration 값을 관리하고, 설정이 exists하는지 확인하며, 필요할 때 설정을 remove합니다. 각 property를 명시적으로 정의하지 않아도 됩니다.

코드를 두 개의 파일로 구성합니다:

  • Config.php: private array를 사용하여 configuration 값을 내부에 저장하는 Config class를 Create합니다. 네 가지 property magic method를 모두 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 파일을 Include합니다. 세 개의 inputs를 받습니다: 설정 이름, 설정 값, 두 번째 설정 이름입니다. Config instance를 Create하고 다음 작업을 수행합니다:
    • first 설정을 given 값으로 설정합니다
    • isset()을 사용하여 first 설정이 exists하는지 Print합니다: "exists" 또는 "missing"을 출력합니다
    • first 설정의 값을 Print합니다
    • 현재 설정의 count를 Print합니다
    • unset()을 사용하여 first 설정을 remove합니다
    • 이제 first 설정이 exists하는지 Print합니다: "exists" 또는 "missing"을 출력합니다
    • second 설정의 값을 Print합니다(never 설정되지 않음)

각 출력은 각각 별도의 줄에 표시되어야 합니다. 실제 property가 정의되어 있지 않더라도 magic method를 사용하면 $config->theme = "dark"isset($config->theme)과 같은 자연스러운 property 구문으로 Config 객체와 상호 작용할 수 있습니다.

직접 해보기

<?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: 두 번째 설정의 값 출력 (설정되지 않음)

?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 PHP 컴파일러