Nachdem das Unternehmen PHP7 aktualisiert hat, ist so etwas wie dieses aufgetretenisset($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
'foobar']; public function __get($key) { if (isset($this->attributes[$key])) { return $this->attributes[$key]; } } } $post = new Post(); echo isset($post->content); // false
zurück, dafalse
kein Attribut vonfoo
ist, sondern aus < entnommen wird >Post
__get
__isset
Wie kann man also das oben genannte Problem lösen? Mit der magischen Methode
'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
Ein Beispiel ähnlich
Eloquent
Wenn 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; } }
__isset
Dann definieren wir ein
und ein
Post Moel
class Post extends Model { protected function user() { $user = new User(); $user->name = 'user name'; return $user; } } class User extends Model { }
User Moel
Okay, lass es uns überprüfen
$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;
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 vonisset
von$post->user->name
, sodasspost
zurelations
wird, und dann wirdisset($post->user)
zutrue
.isset($post->user->name)
true
Endlich habe ich die Antwort in
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
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!