php - 힌트 - 브라켓 자동완성




PHP 7의 속성에 대한 힌트 힌트? (3)

PHP 7.4 다음과 같은 유형의 속성을 지원합니다 :

class Person
{
    public string $name;
    public DateTimeImmutable $dateOfBirth;
}

PHP 7.3 및 이전 버전에서는이를 지원하지 않지만 몇 가지 대안이 있습니다.

유형 선언이있는 getter 및 setter를 통해서만 액세스 할 수있는 개인 속성을 만들 수 있습니다.

class Person
{
    private $name;
    public function getName(): string {
        return $this->name;
    }
    public function setName(string $newName) {
        $this->name = $newName;
    }
}

공용 속성을 만들고 docblock을 사용하여 코드를 읽고 IDE를 사용하는 사람들에게 형식 정보를 제공 할 수 있지만 런타임 형식 검사는 제공하지 않습니다.

class Person
{
    /**
      * @var string
      */
    public $name;
}

실제로 게터와 세터 및 docblock을 결합 할 수 있습니다.

좀 더 모험적이라면 __get , __set , __unset__unset magic 메서드 로 가짜 속성을 만들고 유형을 직접 확인할 수 있습니다. 그래도 추천할지 확실하지 않습니다.

PHP 7은 클래스 속성에 대한 유형 힌트를 지원합니까?

세터 / 게터 뿐만 아니라 부동산 자체도 마찬가지 입니다.

다음과 같은 것 :

class Foo {
    /**
     *
     * @var Bar
     */
    public $bar : Bar;
}

$fooInstance = new Foo();
$fooInstance->bar = new NotBar(); //Error

세터를 사용할 수 있습니다

class Bar {
    public $val;
}

class Foo {
    /**
     *
     * @var Bar
     */
    private $bar;

    /**
     * @return Bar
     */
    public function getBar()
    {
        return $this->bar;
    }

    /**
     * @param Bar $bar
     */
    public function setBar(Bar $bar)
    {
        $this->bar = $bar;
    }

}

$fooInstance = new Foo();
// $fooInstance->bar = new NotBar(); //Error
$fooInstance->setBar($fooInstance);

산출:

TypeError: Argument 1 passed to Foo::setBar() must be an instance of Bar, instance of Foo given, called in ...

7.4 이상 :

@Andrea가 지적했듯이 새로운 릴리스에서 구현 될 것입니다. 누군가가 7.4 이전에 그것을 사용하기를 원한다면이 솔루션을 여기에 남겨 두겠습니다.

7.3 이하

이 스레드에서 여전히 수신되는 알림을 기반으로, 많은 사람들이 내가 가진 것과 동일한 문제가 있거나 있다고 생각합니다. 이 경우에 대한 나의 해결책은이 동작을 시뮬레이션하기 위해 특성 내에서 setters + __set magic 메소드를 결합하는 것입니다. 여기있어:

trait SettersTrait
{
    /**
     * @param $name
     * @param $value
     */
    public function __set($name, $value)
    {
        $setter = 'set'.$name;
        if (method_exists($this, $setter)) {
            $this->$setter($value);
        } else {
            $this->$name = $value;
        }
    }
}

그리고 여기 데모가 있습니다 :

class Bar {}
class NotBar {}

class Foo
{
    use SettersTrait; //It could be implemented within this class but I used it as a trait for more flexibility

    /**
     *
     * @var Bar
     */
    private $bar;

    /**
     * @param Bar $bar
     */
    protected function setBar(Bar $bar)
    {
        //(optional) Protected so it wont be called directly by external 'entities'
        $this->bar = $bar;
    }
}

$foo = new Foo();
$foo->bar = new NotBar(); //Error
//$foo->bar = new Bar(); //Success

설명

우선, bar 를 private 속성으로 정의하여 PHP가 __set automagically 캐스팅합니다.

__set 은 현재 객체에 선언 된 setter가 있는지 확인합니다 ( method_exists($this, $setter) ). 그렇지 않으면 평상시처럼 값만 설정합니다.

타입 힌트 인수 ( setBar(Bar $bar) )를받는 setter 메소드 (setBar)를 선언하십시오.

PHP가 Bar 인스턴스가 아닌 것이 setter로 전달되고 있음을 감지하면 치명적 오류를 자동으로 트리거합니다. 주어진





variable-types