속성 유형 힌트를 도입 할 때 갑자기 "초기화 전에 유형이 지정된 속성에 액세스하면 안됩니다"오류가 발생하는 이유는 무엇입니까?


10

다음과 같이 새로 도입 된 속성 유형 힌트를 사용하도록 클래스 정의를 업데이트했습니다.

class Foo {

    private int $id;
    private ?string $val;
    private DateTimeInterface $createdAt;
    private ?DateTimeInterface $updatedAt;

    public function __construct(int $id) {
        $this->id = $id;
    }


    public function getId(): int { return $this->id; }
    public function getVal(): ?string { return $this->val; }
    public function getCreatedAt(): ?DateTimeInterface { return $this->createdAt; }
    public function getUpdatedAt(): ?DateTimeInterface { return $this->updatedAt; }

    public function setVal(?string $val) { $this->val = $val; }
    public function setCreatedAt(DateTimeInterface $date) { $this->createdAt = $date; }
    public function setUpdatedAt(DateTimeInterface $date) { $this->updatedAt = $date; }
}

그러나 교리에 엔티티를 저장하려고 할 때 오류가 발생합니다.

초기화하기 전에 형식화 된 속성에 액세스하면 안됩니다

이는 $id또는 로만 발생하는 $createdAt것이 아니라 null로 허용되는 속성 인 $value또는로 도 발생 $updatedAt합니다.

답변:


20

PHP 7.4에는 속성에 대한 유형 힌트가 도입되었으므로 모든 속성에 선언 된 유형과 일치하는 값을 갖도록 모든 속성에 유효한 값을 제공하는 것이 특히 중요합니다.

할당되지 않은 변수에는 null값이 없지만 선언 된 type과 절대 일치하지 않는undefined 상태 입니다. .undefined !== null

위 코드의 경우 다음을 수행하십시오.

$f = new Foo(1);
$f->getVal();

당신은 얻을 것이다 :

치명적인 오류 : catch되지 않은 오류 : 초기화하기 전에 형식화 된 속성 Foo :: $ val에 액세스하면 안됩니다

보낸 $val하지도 string않고 null이를 액세스하지 않을 때.

이 문제를 해결하는 방법은 선언 된 유형과 일치하는 모든 속성에 값을 할당하는 것입니다. 환경 설정 및 속성 유형에 따라 속성의 기본값으로 또는 구성 중에이 작업을 수행 할 수 있습니다.

예를 들어 위의 경우 다음을 수행 할 수 있습니다.

class Foo {

    private int $id;
    private ?string $val = null; // <-- declaring default null value for the property
    private DateTimeInterface $createdAt;
    private ?DateTimeInterface $updatedAt;

    public function __construct(int $id) {
        // and on the constructor we set the default values for all the other 
        // properties, so now the instance is on a valid state
        $this->id = $id;
        $this->createdAt = new DateTimeImmutable();
        $this->updatedAt = new DateTimeImmutable();
    }

이제 모든 속성의 값 이 유효 하고 인스턴스의 상태가 유효합니다.

엔터티 값으로 DB에서 제공되는 값에 의존 할 때 특히 자주 발생합니다. 예를 들어 자동 생성 된 ID 또는 생성 및 / 또는 업데이트 된 값; 종종 DB 문제로 남아 있습니다.

자동 생성 된 ID의 경우 권장되는 방법 은 형식 선언을로 변경하는 것 ?int $id = null입니다. 나머지는 속성 유형에 적절한 값을 선택하십시오.


-5

내 오류 :

"Typed property Proxies\\__CG__\\App\\Entity\\Organization::$ must not be accessed before initialization (in __sleep)"

내 솔루션-수업에 다음 방법을 추가하십시오.

public function __sleep()
{
    return [];
}

1
질문을 정확하게 읽고 문제 / 해결책이 아니라 질문에 따라 답하십시오.
MAChitgarha
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.