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

藏色散人
Freigeben: 2023-02-17 11:46:01
nach vorne
2916 Leute haben es durchsucht

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

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

bedeutet ungefähr Folgendes:

 'foobar']; public function __get($key) { if (isset($this->attributes[$key])) { return $this->attributes[$key]; } } } $post = new Post(); echo isset($post->content); // false
Nach dem Login kopieren

Das obige Beispiel gibt immer

zurück, dafalsekein Attribut vonfooist, sondern aus < entnommen wird >Post__get

Magische Methode

__issetWie 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
Nach dem Login kopieren

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; } }
Nach dem Login kopieren
__issetDann 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 { }
Nach dem Login kopieren
User MoelOkay, 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;
Nach dem Login kopieren
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 vonissetvon$post->user->name, sodasspostzurelationswird, und dann wirdisset($post->user)zutrue.isset($post->user->name)trueEndlich 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's comment (core PHP dev) - https://bugs.php.net/bug.php?id=69659
Nach dem Login kopieren
Eloquent modelgefunden: 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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!