객체지향으로 설계된 모던PHP 애플리케이션을 개발하게 되면 하루에도 백번씩 ->
연산자를 쓰게 된다. (안 쓰고 있다면 문제가 있는 것이다.)
근데 얘 이름이 뭘까? object operator라고 한다. 우습게도, 이렇게 자주 쓰는 연산자인데도, 공식문서에서는 뜬금없이 '프로퍼티' 문서의 어느 한 단락에 지나가듯이 그 이름이 명시되어 있다.
클래스 메소드 안에서* 정적 속성이 아닌 속성은
->
(객체연산자)를 통해서$this->property
하는 식으로 접근할 수 있습니다(property
라는 이름의 속성이 있을 경우).*역자주: 문서는 '클래스를 구현할 때' 프로퍼티에 접근하는 법을 설명하고 있음
여기까지는 다들 아시는 내용일 테고, 아래는 (일단 나는) 잘 몰랐던 사실.
한마디로, 다음이 작동한다.
// 세팅만 잘 돼 있다면 $a에 값이 잘 할당됨
$a = $b->c->d->e->f;
// 연쇄적으로 찾아서 못 찾을 경우 "기본값"을 주는 것도 가능
$foo = $bar->dee->meh ?? 'yay';
왜 그러냐면... ->
연산자는 null
이 나오지 않는 한 끝까지 가기 때문이다. 중간에든 언제든 null
이 나오면 그대로 null
로 처리되고, 끝까지 null
이 안 나오면 그냥 획득된 프로퍼티를 반환한다. 그래서, 연쇄가 가능하다. 심지어 __get()
매직메소드로 접근하는 대상일 때도 마찬가지다.
class Bar {
private $attrs = [
'dee' => 'pow',
];
public function __get($name) {
return $this->attrs[$name] ?? null;
}
}
class Foo {
private $attrs = [];
public function __get($name) {
return $this->attrs[$name] ?? null;
}
public function __construct(?Bar $b = null) {
if ($b) {
$this->attrs['bar'] = $b;
}
}
}
$foo1 = new Foo;
$foo2 = new Foo(new Bar);
var_dump($foo1->bar->dee ?? 'yay'); // yay
var_dump($foo2->bar->dee ?? 'nay'); // pow
관련 스택오버플로 질문글이 있으니 보실 분들은 보시길.
정말 널널하다 PHP