Heim  >  Artikel  >  Backend-Entwicklung  >  isset in PHP7

isset in PHP7

Guanhui
Guanhuinach vorne
2020-05-09 11:09:092821Durchsuche

Nach dem Upgrade von PHP7 stimmt etwas nicht mit isset($post->user-> name) ist immer falsch

Das vorherige PHP 5.6 war normal

Das Laravel Version ist 5.1.35 (sie wurde schon lange nicht mehr aktualisiert)

Schauen Sie sich zuerst isset an

isset wird verwendet, um zu erkennen, ob eine Variable gesetzt ist

Schauen wir uns zunächst ein offizielles Beispiel an

Es 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 false zurück, da foo keine Eigenschaft von Post ist, aber die von __get

magische Methode __isset

Wie kann man also das oben genannte Problem lösen? Verwenden Sie die magische 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 wie Eloquent

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

Zuerst ein Modell, einfache Implementierung. __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;
    }
}

Dann definieren wir ein Post-Moel und ein User-Moel

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

Okay, lass uns isset ü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;

Antwort

Bei der Analyse der obigen Ergebnisse scheint es, dass die isset-Methode von PHP 7 die Beurteilung des Objekts geändert hat. Wenn es einmal ausgeführt wird, wird $post->user->name, d Beziehungen des Beitrags, sodass isset ($post->user) wahr ist und dann isset ($post->user->name) wahr ist.

Endlich die Antwort im Git-Protokoll des Eloquent-Modells gefunden:

PHP 7 hat einen Fehler mit __isset behoben, der sowohl die

native isset- als auch die empty-Methode betrifft . Dies verursacht bestimmte Probleme

bei der Überprüfung von isset oder empty für Beziehungen in Eloquent. In

PHP 7 wird überprüft, ob eine Eigenschaft für eine entladene Beziehung vorhanden ist,

zum Beispiel isset( $this->relation->id) gibt immer

false zurück, da PHP 7 im Gegensatz zu PHP 5.6 jetzt

den Offset jedes Attributs prüft, bevor es mit

die nächste. In PHP 5.6 würde es die Beziehung eifrig laden

ohne den Offset zu überprüfen. Diese Änderung bringt das

beabsichtigte Verhalten der __isset-Kernmethode

für PHP 7, damit es wie in PHP 5.6 funktioniert.

Als Referenz sehen Sie sich bitte den folgenden Link an,

insbesondere Nikita Popovs Kommentar (Kern-PHP-Entwickler) –

https://bugs.php.net/bug.php?id=69659

Wenn PHP7 isset beurteilt wird, wird es ungefähr der Reihe nach beurteilt. php5.6 lädt die Beziehung vor. Tatsächlich hat Laravel bereits im Mai eine entsprechende Verarbeitung durchgeführt, sodass dieses Problem nach dem Upgrade von Laravel natürlich verschwinden wird.

Empfohlene Tutorials: „

PHP7-Tutorial

“ „

PHP-Tutorial
“ „

Laravel-Tutorial

Das obige ist der detaillierte Inhalt vonisset in PHP7. 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