這篇文章主要介紹升級php7后isset方法始終為 false怎么辦,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)公司服務項目包括滎陽網(wǎng)站建設、滎陽網(wǎng)站制作、滎陽網(wǎng)頁制作以及滎陽網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,滎陽網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到滎陽省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
公司升級 php7 后出現(xiàn)了一個問題,類似這樣 isset($post->user->name)
始終為 false
,之前的php 5.6 就很正常,laravel 版本是 5.1.35(很久沒升級了)。
先看看isset
isset
用來檢測變量是否設置
首先我們來看官方的一個例子
大致上是下面這個意思
<?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); // false
上面這個例子將永遠返回 false
,因為 foo
并不是 Post
的屬性,而是 __get
取出來的
魔術方法__isset
那么怎么解決上面那個問題呢?使用魔術方法
<?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
類似 Eloquent
的例子
看著 laravel 5.1.35 的代碼,我們自己寫一個簡單的例子
先有一個 Model
,簡單的實現(xiàn)。__get
,__set
,__isset
class Model { // 存放屬性 protected $attributes = []; // 存放關系 protected $relations = []; public function __get($key) { if( isset($this->attributes[$key]) ) { return $this->attributes[$key]; } // 找到關聯(lián)的對象,放在關系里面 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; } }
然后我們定義一個 Post Moel
和一個 User Moel
class Post extends Model { protected function user() { $user = new User(); $user->name = 'user name'; return $user; } } class User extends Model { }
好了來驗證一下isset
$post = new Post(); echo 'isset 發(fā)帖用戶:'; echo isset($post->user) ? 'true' : 'false'; // false echo PHP_EOL; echo 'isset 發(fā)帖用戶的名字:'; echo isset($post->user->name) ? 'true' : 'false'; // false echo PHP_EOL; echo '發(fā)帖用戶的名字:'; echo $post->user->name; // user name echo PHP_EOL; echo '再次判斷 isset 發(fā)帖用戶的名字:'; echo isset($post->user->name) ? 'true' : 'false'; // true echo PHP_EOL;
答案
分析上面的結果,感覺像是 php 7 isset
方法對對象的判斷有了變化,如果先執(zhí)行一次,$post->user->name
,也就是將 user 放在 post
的 relations
中,這樣 isset($post->user)
為 true
,隨后 isset($post->user->name)
才為 true
。
最后在 Eloquent model
的 git log
中 找到了答案,
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
大致上是 php7 isset 判斷的時候,會依次判斷。php5.6 則會預加載關系。其實 laravel 也早就做了相關的處理,所以升級 laravel 后,自然也就沒有這個問題了。
以上是升級php7后isset方法始終為 false怎么辦的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享文章:升級php7后isset方法始終為false怎么辦
文章源于:http://jinyejixie.com/article18/jjhjgp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)頁設計公司、網(wǎng)站建設、建站公司、全網(wǎng)營銷推廣、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)