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); //trueEloquent와 비슷한 예시
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
