TIL PHP 9/13/2023

엽토군·2023년 9월 13일
0

TIL

목록 보기
11/14

객체 연산자

객체지향으로 설계된 모던PHP 애플리케이션을 개발하게 되면 하루에도 백번씩 -> 연산자를 쓰게 된다. (안 쓰고 있다면 문제가 있는 것이다.)

근데 얘 이름이 뭘까? object operator라고 한다. 우습게도, 이렇게 자주 쓰는 연산자인데도, 공식문서에서는 뜬금없이 '프로퍼티' 문서의 어느 한 단락에 지나가듯이 그 이름이 명시되어 있다.

클래스 메소드 안에서* 정적 속성이 아닌 속성은 ->(객체연산자)를 통해서 $this->property 하는 식으로 접근할 수 있습니다(property라는 이름의 속성이 있을 경우).

*역자주: 문서는 '클래스를 구현할 때' 프로퍼티에 접근하는 법을 설명하고 있음

여기까지는 다들 아시는 내용일 테고, 아래는 (일단 나는) 잘 몰랐던 사실.

객체 연산자는 연쇄 가능하며 null 병합도 가능함

한마디로, 다음이 작동한다.

// 세팅만 잘 돼 있다면 $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

profile
6년차 PHP 개발자입니다.

0개의 댓글