PHP 8 게터의 모든 맛

Getter는 클래스가 가질 수 있는 가장 기본적인 메서드입니다. 그들의 유일한 작업은 일반적으로 속성에서 값을 반환하는 것입니다. 그것에 대해 별로 할 말이 없습니다.

아니면 있습니까? 🤨

오늘은 PHP 8.0에서 getter를 구현할 수 있는 10가지 방법을 소개하겠습니다.
  • 공개 액세스
  • 클래식 게터
  • 동사가 없는 고전적인 getter
  • 게터/세터
  • 매직 게터
  • 오프셋 게터
  • 매직 콜
  • 참조 게터
  • 캡슐화 위반 🤫
  • 클로저 반환

  • 시작하자!

    공개 액세스




    class User
    {
        public string $name = "Robert PAULSON";
    }
    


    ✅ 장점
  • getter 메서드를 작성할 필요가 없습니다.

  • ❌ 단점
  • 인터페이스의 일부가 될 수 없음
  • 개체의 내부 상태를 노출합니다
  • .

    클래식 게터




    class User
    {
        public function getName(): string
        {
            return "Robert PAULSON";
        }
    }
    


    ✅ 장점
  • 인터페이스의 일부일 수 있음
  • 간단하고 이해하기 쉬운

  • ❌ 단점
  • ¯\_(ツ)_/¯

  • 동사가 없는 고전적인 getter




    class User
    {
        public function name(): string
        {
            return "Robert PAULSON";
        }
    }
    


    ✅ 장점
  • 여전히 인터페이스의 일부일 수 있음
  • getName보다 짧음

  • ❌ 단점
  • 동사가 없는 메소드는 혼동될 수 있음

  • 게터/세터




    class User
    {
        private string $name = "Robert PAULSON";
    
        public function name(?string $name = null): string
        {
            if ($name) {
                $this->name = $name;
            }
    
            return $this->name;
        }
    }
    


    ✅ 장점
  • 위와 동일
  • setter도 필요한 경우 작성해야 할 코드가 적음

  • ❌ 단점
  • 값을 null로 설정하려면 어떻게 합니까?
  • Single Responsibility Principle 위반

  • 매직 게터




    /**
     * @property string $name
     */
    class User
    {
        private string $name = "Robert PAULSON";
    
        public function __get($key)
        {
            if ($key == 'name') {
                return $this->name;
            }
        }
    }
    


    ✅ 장점
  • 자신의 조건에 따라 보호된 멤버와 비공개 멤버를 노출할 수 있습니다
  • .

    ❌ 단점
  • 반환된 값을 항상 입력할 수는 없습니다.
  • 일부 회사에서 이것을 (진지하게) 금지했습니다
  • annotation @property가 필요합니다. 그렇지 않으면 PHPStorm이 이를 "볼"수 없습니다
  • .

    오프셋 게터




    class User extends ArrayAccess
    {
        public offsetExists($offset): bool
        {
            return $offset == 'name';
        }
    
        public offsetGet($offset)
        {
            if ($offset == 'name') {
                return 'Robert PAULSON';
            }
        }
    }
    


    ✅ 장점
  • 매직 게터와 동일
  • 슈퍼 쿨$object['name'] 표기

  • ❌ 단점
  • 매직 게터와 동일

  • 매직 콜




    /**
     * @method string getName()
     */
    class User
    {
        public function __call($method, $args)
        {
            if ($method == 'getName') {
                return 'Robert PAULSON';
            }
        }
    }
    


    ✅ 장점
  • 매직 게터를 사용하는 것과 동일
  • 여러 getter를 하나의 방법으로 그룹화하여 "공간"절약
  • 새 메서드를 추가하지 않고 기존 getter에 대한 별칭을 만들 수 있습니다.

  • ❌ 단점
  • annotation @method가 필요합니다. 그렇지 않으면 PHPStorm이 이를 "볼"수 없습니다
  • .
  • 클래스의 메서드 수를 줄이기 위해 이것이 필요한 경우 디자인 문제의 신호일 수 있습니다
  • .

    참조 게터




    class User
    {
        private string $name = "Robert PAULSON";
    
        public function &getName(): string
        {
            return $this->name;
        }
    }
    
    // usage
    $user = new User;
    var_dump($user); // string(14) "Robert PAULSON"
    
    $name = &$user->getName();
    $name = "Tyler DURDEN";
    var_dump($user); // string(12) "Tyler DURDEN"
    


    ✅ 장점
  • 성능 최적화에 사용됨(함수 호출 오버헤드 제거)

  • ❌ 단점
  • 당신이 무엇을 하고 있는지 알기를 바랍니다

  • 캡슐화 위반




    class User
    {
        private string $name = "Robert PAULSON";
    }
    
    // can't access $name because it's private
    // and there's no getter to obtain its value
    $user = new User();
    
    // let's use the reflection API
    $property = (new ReflectionClass(User::class))->getProperty('name');
    $property->setAccessible(true);
    $name = $property->getValue($user);
    
    echo $name; // Robert PAULSON
    


    ✅ 장점
  • 소유하지 않은 클래스를 다시 작성하지 않고 디버깅하는 데 매우 유용합니다.

  • ❌ 단점
  • 매우 느림
  • 꽤 못생긴

  • 클로저 반환




    class User
    {
        private $name = "Robert PAULSON";
    
        public function obtainNameGetter(): callable
        {
            return fn() => $this->name;
        }
    
        public function setName(string $name): void
        {
            $this->name = $name;
        }
    }
    
    // usage
    $user = new User();
    $getter = $user->obtainNameGetter();
    
    echo $getter(); // "Robert PAULSON"
    
    // now let's change the username
    $user->setName("Tyler DURDEN");
    
    echo $getter(); // "Tyler DURDEN"
    


    ✅ 장점
  • 순환 종속성을 해결하는 데 사용할 수 있음
  • 가난한 사람 지연 로딩 구현
  • 반환된 클로저를 작성할 수 있습니다.

  • ❌ 단점
  • 반품된 클로저는 블랙박스입니다.
  • 반환된 값을 쉽게 직렬화할 수 없음



  • 내가 뭐 놓친 거 없니? 댓글로 이 목록에 대해 어떻게 생각하는지 알려주고 좋아요/팔로우를 잊지 마세요. 더 많은 기사를 쓸 수 있도록 동기를 부여합니다 🤗

    좋은 웹페이지 즐겨찾기