php7을 업그레이드한 후 isset이 올바르지 않습니다.
회사에서 php7을 업그레이드한 후 문제가 발생했습니다.
이와 비슷하게 isset($post->user->name)은 항상 false였습니다. 이전 PHP 5.6에서는 정상입니다.
Laravel 버전은 5.1.35입니다(오랜 기간 업그레이드되지 않았습니다)
먼저 isset을 살펴보겠습니다isset은 변수가 설정되었는지 감지하는 데 사용됩니다.
먼저 공식적인 예를 살펴보겠습니다
기본적으로 다음을 의미합니다
<?php class Post { protected $attributes = ['content' => 'foobar']; public function __get($key) { if (isset($this->attributes[$key])) { return $this->attributes[$key]; } } } $post = new Post(); echo isset($post->content); // false
위의 예는 항상 false를 반환합니다. 왜냐하면 foo는 Post의 속성이 아니고 __get
magic 메서드에 의해 제거되기 때문입니다. __isset그러면 위의 문제를 어떻게 해결할 수 있을까요? 매직 메소드를 사용하여
<?PHP class Post { protected $attributes = ['content' => 'foobar']; public function __get($key) { if (isset($this->attributes[$key])) { return $this->attributes[$key]; } } public function __isset($key) { if (isset($this->attributes[$key])) { return true; } return false; } } $post = new Post(); echo isset($post->content); //true
laravel 5.1.35의 코드를 보면 우리가 직접 간단한 예시를 작성해봅니다
먼저 간단한 구현인 모델이 있습니다. __get, __set, __isset
class Model { // 存放属性 protected $attributes = []; // 存放关系 protected $relations = []; public function __get($key) { if( isset($this->attributes[$key]) ) { return $this->attributes[$key]; } // 找到关联的对象,放在关系里面 if (method_exists($this, $key)) { $relation = $this->$method(); return $this->relations[$method] = $relation; } } public function __set($k, $v) { $this->attributes[$k] = $v; } public function __isset($key) { if (isset($this->attributes[$key]) || isset($this->relations[$key])) { return true; } return false; } }
그런 다음 Post Moel과 User Moel을 정의합니다. $post->user->name을 먼저 실행하면, 즉 user를 post의 관계에 두게 되므로 isset($post->user)가 true가 되고, 그 다음 isset($post)이 됩니다. ->사용자->이름)이 true입니다.
마침내 Eloquent 모델의 git 로그에서 답을 찾았습니다.
PHP 7에서는네이티브 isset과 빈 메소드 모두에 영향을 미치는 __isset 버그를 수정했습니다. 이로 인해 관계에서 isset 또는 비어 있는지 확인하는 데 특정 문제가
발생합니다. Eloquent에서는 PHP 7에서 언로드된 관계에 속성이 있는지 확인하는 경우 예를 들어 isset($this->relation->id)는 항상false를 반환합니다. 왜냐하면 PHP 5.6과 달리 PHP 7은 이제
다음 속성에 연결하기 전에 각 속성의 오프셋을 확인합니다. PHP 5.6에서는 오프셋을 확인하지 않고 관계
를 즉시 로드합니다. 이 변경으로 인해 핵심 Eloquent 모델 __isset 메소드의
의도된 동작이 다시 나타납니다.
PHP 7에서는 PHP 5.6에서처럼 작동합니다.참고로 다음 링크를 확인하세요. 구체적으로 Nikita Popov의 의견(핵심 PHP 개발자) - https://bugs.php.net/bug .php?id=69659대략 php7 isset을 심사할 때 순차적으로 심사하게 됩니다. php5.6은 관계를 미리 로드합니다. 실제로 라라벨도 이미 5월 초에 관련 처리를 했기 때문에 라라벨을 업그레이드하면 이 문제는 자연스럽게 사라질 것입니다.
추천 튜토리얼: "
PHP7 Tutorial" "
PHP Tutorial" "
Laravel Tutorial"
위 내용은 PHP7에 설정되어 있습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!