다음과 같이 새로 도입 된 속성 유형 힌트를 사용하도록 클래스 정의를 업데이트했습니다.
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
합니다.
답변
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
입니다. 나머지는 속성 유형에 적절한 값을 선택하십시오.
답변
내 오류 :
"Typed property Proxies\\__CG__\\App\\Entity\\Organization::$ must not be accessed before initialization (in __sleep)"
내 솔루션-수업에 다음 방법을 추가하십시오.
public function __sleep()
{
return [];
}