__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처럼 동작하는 객체를 구축하는 데 흔히 사용됩니다.
챌린지
쉬움magic method를 사용하여 설정을 동적으로 저장하는 유연한 configuration 관리자를 만들어 봅시다. 여러분의 class는 property 접근을 가로채 configuration 값을 관리하고, 설정이 exists하는지 확인하며, 필요할 때 설정을 remove합니다. 각 property를 명시적으로 정의하지 않아도 됩니다.
코드를 두 개의 파일로 구성합니다:
Config.php: private array를 사용하여 configuration 값을 내부에 저장하는Configclass를 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합니다
count()method를 추가합니다.main.php: Config 파일을 Include합니다. 세 개의 inputs를 받습니다: 설정 이름, 설정 값, 두 번째 설정 이름입니다.Configinstance를 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: 두 번째 설정의 값 출력 (설정되지 않음)
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize복습 - 사용자 지정 컬렉션직접 연습해 보세요: 온라인 PHP 컴파일러