php7로 업그레이드 후 isset 메소드가 항상 false인 문제 해결
회사에서 php7을 업그레이드한 후 문제가 발생했습니다. isset($post->user->name)
과 같은 내용은 항상 false
였으며 이전 PHP 5.6은 Normal., laravel 버전은 5.1.35입니다(오랫동안 업그레이드되지 않았습니다). 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
取出来的
魔术方法 __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
类似 Eloquent
的例子
看着 laravel 5.1.35 的代码,我们自己写一个简单的例子
先有一个 Model
,简单的实现。__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
class Post extends Model { protected function user() { $user = new User(); $user->name = 'user name'; return $user; } } class User extends Model { }
好了来验证一下isset
$post = new Post(); echo 'isset 发帖用户:'; echo isset($post->user) ? 'true' : 'false'; // false echo PHP_EOL; echo 'isset 发帖用户的名字:'; echo isset($post->user->name) ? 'true' : 'false'; // false echo PHP_EOL; echo '发帖用户的名字:'; echo $post->user->name; // user name echo PHP_EOL; echo '再次判断 isset 发帖用户的名字:'; echo isset($post->user->name) ? 'true' : 'false'; // true echo PHP_EOL;
答案
分析上面的结果,感觉像是 php 7 isset
方法对对象的判断有了变化,如果先执行一次,$post->user->name
,也就是将 user 放在 post
的 relations
中,这样 isset($post->user)
为 true
,随后 isset($post->user->name)
才为 true
。
最后在 Eloquent model
的 git log
isset
를 먼저 살펴보세요isset
는 변수가 설정되었는지 감지하는 데 사용됩니다🎜🎜먼저 공식 예제를 살펴보겠습니다🎜 🎜대략 다음을 의미합니다🎜PHP 7 has fixed a bug with __isset which affects both the native isset and empty methods. This causes specific issues with checking isset or empty on relations in Eloquent. In PHP 7 checking if a property exists on an unloaded relation, for example isset($this->relation->id) is always returning false because unlike PHP 5.6, PHP 7 is now checking the offset of each attribute before chaining to the next one. In PHP 5.6 it would eager load the relation without checking the offset. This change brings back the intended behavior of the core Eloquent model __isset method for PHP 7 so it works like it did in PHP 5.6. For reference, please check the following link, specifically Nikita Popov's comment (core PHP dev) - https://bugs.php.net/bug.php?id=69659
false
를 반환합니다. 왜냐하면 foo
는 Post
의 속성이 아니지만 이기 때문입니다. > __get
Taken out🎜🎜Magic method __isset
🎜🎜 그렇다면 위의 문제를 어떻게 해결해야 할까요? 마법의 방법을 사용하세요🎜rrreee🎜Eloquent
와 유사한 예🎜🎜laravel 5.1.35의 코드를 보면 우리가 직접 간단한 예를 작성해봅니다🎜🎜먼저 Model
가 있습니다 >, 간단한 실현. __get
, __set
, __isset
🎜rrreee🎜 그런 다음 Post Moel
및 User Moel🎜rrreee🎜좋아, <code>isset
를 검증하자🎜rrreee🎜답변🎜🎜위 결과를 분석해 보면 php 7 isset
같은 느낌이다. 한번 실행하면 $post->user->name
, 즉 user가 post
에 위치하게 됩니다. code> 관계, isset($post->user)
가 true
이고 isset($post->user- >name )
는 true
입니다. 🎜🎜결국 Eloquent model
의 git log
에서 답을 찾았습니다. 🎜rrreee🎜대략 php7 isset이 심사할 때 순차적으로 심사하게 됩니다. php5.6은 관계를 미리 로드합니다. 사실 laravel에서는 이미 관련 처리를 해두었기 때문에 laravel을 업그레이드하고 나면 이 문제는 자연스럽게 사라질 것입니다. 🎜위 내용은 php7로 업그레이드 후 isset 메소드가 항상 false인 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

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

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











php7.0에서 mongo 확장을 설치하는 방법: 1. mongodb 사용자 그룹 및 사용자를 생성합니다. 2. mongodb 소스 코드 패키지를 다운로드하고 소스 코드 패키지를 "/usr/local/src/" 디렉터리에 넣습니다. "src/" 디렉터리를 입력합니다. 4. 소스 코드 패키지의 압축을 풉니다. 5. mongodb 파일 디렉터리를 생성합니다. 6. "mongodb/" 디렉터리에 파일을 복사합니다. 7. mongodb 구성 파일을 생성하고 구성을 수정합니다.

php5에서는 fsockopen() 함수를 사용하여 TCP 포트를 감지할 수 있습니다. 이 기능은 네트워크 연결을 열고 일부 네트워크 통신을 수행하는 데 사용할 수 있습니다. 그러나 php7에서는 fsockopen() 함수에 포트를 열 수 없거나 서버에 연결할 수 없는 등의 몇 가지 문제가 발생할 수 있습니다. 이 문제를 해결하기 위해, 우리는 소켓_create() 함수와 소켓_연결() 함수를 사용하여 TCP 포트를 감지할 수 있습니다.

PHP 7.0에서 설치된 플러그인이 표시되지 않는 문제를 해결하려면: 플러그인 구성을 확인하고 플러그인을 활성화하세요. 구성 변경 사항을 적용하려면 PHP를 다시 시작하세요. 플러그인 파일 권한이 올바른지 확인하세요. 플러그인이 올바르게 작동하도록 하려면 누락된 종속성을 설치하세요. 다른 모든 단계가 실패하면 PHP를 다시 빌드하세요. 다른 가능한 원인으로는 호환되지 않는 플러그인 버전, 잘못된 버전 로드 또는 PHP 구성 문제 등이 있습니다.

이 글에서는 PHP가 특정 키가 배열에 존재하는지 여부를 어떻게 판단하는지 자세히 설명할 것입니다. 편집자는 이것이 매우 실용적이라고 생각하므로 이 글을 읽으신 후 참고하실 수 있기를 바랍니다. PHP는 지정된 키가 배열에 존재하는지 확인합니다. PHP에서는 지정된 키가 배열에 존재하는지 확인하는 여러 가지 방법이 있습니다. 1. isset() 함수를 사용합니다: isset($array["key"]) 이 함수 부울 값을 반환합니다. 지정된 키가 존재하면 true이고, 그렇지 않으면 false입니다. 2. array_key_exists() 함수를 사용하세요: array_key_exists("key",$arr

PHP 서버 환경에 대한 일반적인 솔루션에는 올바른 PHP 버전이 설치되어 있는지, 관련 파일이 모듈 디렉터리에 복사되었는지 확인하는 것이 포함됩니다. SELinux를 일시적으로 또는 영구적으로 비활성화합니다. 필요한 확장이 추가되고 올바르게 설정되었는지 확인하려면 PHP.ini를 확인하고 구성하십시오. PHP-FPM 서비스를 시작하거나 다시 시작합니다. 해결 문제에 대해서는 DNS 설정을 확인하세요.

php7.0 설치 및 배포 방법: 1. PHP 공식 웹사이트로 이동하여 로컬 시스템에 해당하는 설치 버전을 다운로드합니다. 2. 다운로드한 zip 파일을 지정된 디렉터리에 추출합니다. 3. 명령줄 창을 열고 다음으로 이동합니다. "E:\php7" 디렉토리 "php -v" 명령을 실행하세요.

시스템이 다시 시작된 후 UnixSocket의 권한을 자동으로 설정하는 방법. 시스템이 다시 시작될 때마다 UnixSocket의 권한을 수정하려면 다음 명령을 실행해야합니다.

Docker 환경을 사용할 때 Docker 환경에 Extensions를 설치하기 위해 PECL을 사용하여 오류의 원인 및 솔루션. 종종 일부 두통이 발생합니다 ...
