Heim >Backend-Entwicklung >PHP7 >Lösen Sie das Problem, dass die Isset-Methode nach dem Upgrade auf PHP7 immer falsch ist
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
bedeutet ungefähr Folgendes:
<?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); // falseDas obige Beispiel gibt immer
zurück, da false
kein Attribut von foo
ist, sondern aus Post
__get
__isset
Wie kann man also das oben genannte Problem lösen? Mit der magischen Methode
<?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
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
AntwortBei 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
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!