Heim  >  Artikel  >  Backend-Entwicklung  >  Lösen Sie das Problem, dass die Isset-Methode nach dem Upgrade auf PHP7 immer falsch ist

Lösen Sie das Problem, dass die Isset-Methode nach dem Upgrade auf PHP7 immer falsch ist

藏色散人
藏色散人nach vorne
2019-03-29 17:15:343063Durchsuche

Nachdem das Unternehmen PHP7 aktualisiert hat, ist so etwas wie dieses aufgetreten  isset($post->user->name) Die vorherige PHP-Version 5.6 war normal und die Laravel-Version war 5.1.35 (sie wurde schon lange nicht mehr aktualisiert). . false

Lassen Sie uns zuerst einen Blick darauf werfen.isset

wird verwendet, um zu erkennen, ob die Variable gesetzt ist.isset

Lassen Sie uns zunächst einen Blick darauf werfen ein offizielles Beispiel

bedeutet ungefähr Folgendes:

<?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

Das obige Beispiel gibt immer

zurück, da false kein Attribut von foo ist, sondern aus Post __get

Magische Methode

__issetWie kann man also das oben genannte Problem lösen? Mit der magischen Methode

<?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

Ein Beispiel ähnlich

EloquentWenn wir uns den Code von Laravel 5.1.35 ansehen, schreiben wir selbst ein einfaches Beispiel

Zuerst gibt es eines

, einfache Implementierung.

, Model, __get__set

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;
    }
}
__issetDann definieren wir ein

und ein

Post Moel

class Post extends Model
{

    protected function user()
    {
        $user = new User();
        $user->name = &#39;user name&#39;;
        return $user;
    }

}

class User extends Model
{
}
User MoelOkay, lass es uns überprüfen

$post = new Post();

echo &#39;isset 发帖用户:&#39;;
echo isset($post->user) ? &#39;true&#39; : &#39;false&#39;;  // false
echo PHP_EOL;

echo &#39;isset 发帖用户的名字:&#39;;
echo isset($post->user->name) ? &#39;true&#39; : &#39;false&#39;;  // false
echo PHP_EOL;

echo &#39;发帖用户的名字:&#39;;
echo $post->user->name;    // user name
echo PHP_EOL;

echo &#39;再次判断 isset 发帖用户的名字:&#39;;
echo isset($post->user->name) ? &#39;true&#39; : &#39;false&#39;;   // true
echo PHP_EOL;
isset

Antwort

Bei der Analyse der obigen Ergebnisse scheint es, als hätte sich die Beurteilung des Objekts durch die PHP 7

-Methode geändert, wenn sie einmal ausgeführt wird,

, Benutzer Platzieren Sie es innerhalb von isset von $post->user->name, sodass post zu relations wird, und dann wird isset($post->user) zu true. isset($post->user->name) true Endlich habe ich die Antwort in

von

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&#39;s comment (core PHP dev) - 
https://bugs.php.net/bug.php?id=69659
Eloquent model gefunden: Wenn PHP7 urteilt, wird es der Reihe nach urteilen. php5.6 lädt die Beziehung vor. Tatsächlich hat Laravel bereits eine entsprechende Verarbeitung durchgeführt, sodass dieses Problem nach dem Upgrade von Laravel natürlich verschwindet. git log

Das obige ist der detaillierte Inhalt vonLösen Sie das Problem, dass die Isset-Methode nach dem Upgrade auf PHP7 immer falsch ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Was ist PHP 7?Nächster Artikel:Was ist PHP 7?