> 백엔드 개발 > PHP7 > PHP7에 설정되어 있습니다.

PHP7에 설정되어 있습니다.

Guanhui
풀어 주다: 2023-02-17 14:58:01
앞으로
2842명이 탐색했습니다.

php7을 업그레이드한 후 isset이 올바르지 않습니다.

회사에서 php7을 업그레이드한 후 문제가 발생했습니다.

이와 비슷하게 isset($post->user->name)은 항상 false였습니다. 이전 PHP 5.6에서는 정상입니다.

Laravel 버전은 5.1.35입니다(오랜 기간 업그레이드되지 않았습니다)

먼저 isset을 살펴보겠습니다

isset은 변수가 설정되었는지 감지하는 데 사용됩니다.

먼저 공식적인 예를 살펴보겠습니다

기본적으로 다음을 의미합니다

<?php
class Post
{
    protected $attributes = [&#39;content&#39; => &#39;foobar&#39;];
    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 = [&#39;content&#39; => &#39;foobar&#39;];
    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의 코드를 보면 우리가 직접 간단한 예시를 작성해봅니다

먼저 간단한 구현인 모델이 있습니다. __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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿