欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

升級(jí)php7后isset方法始終為false怎么辦

這篇文章主要介紹升級(jí)php7后isset方法始終為 false怎么辦,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括滎陽網(wǎng)站建設(shè)、滎陽網(wǎng)站制作、滎陽網(wǎng)頁制作以及滎陽網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,滎陽網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到滎陽省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

公司升級(jí) php7 后出現(xiàn)了一個(gè)問題,類似這樣 isset($post->user->name) 始終為 false,之前的php 5.6 就很正常,laravel 版本是 5.1.35(很久沒升級(jí)了)。

先看看isset

isset 用來檢測(cè)變量是否設(shè)置

首先我們來看官方的一個(gè)例子

大致上是下面這個(gè)意思

<?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

上面這個(gè)例子將永遠(yuǎn)返回 false,因?yàn)?code> foo 并不是 Post 的屬性,而是 __get 取出來的

魔術(shù)方法__isset

那么怎么解決上面那個(gè)問題呢?使用魔術(shù)方法

<?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 的代碼,我們自己寫一個(gè)簡(jiǎn)單的例子

先有一個(gè) Model,簡(jiǎn)單的實(shí)現(xiàn)。__get,__set,__isset

class Model
{
    // 存放屬性
    protected $attributes = [];

    // 存放關(guān)系
    protected $relations = [];

    public function __get($key)
    {
        if( isset($this->attributes[$key]) ) {
            return $this->attributes[$key];
        }

          // 找到關(guān)聯(lián)的對(duì)象,放在關(guā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;
    }
}

然后我們定義一個(gè) Post Moel 和一個(gè) User Moel

class Post extends Model
{

    protected function user()
    {
        $user = new User();
        $user->name = 'user name';
        return $user;
    }

}

class User extends Model
{
}

好了來驗(yàn)證一下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;

答案

分析上面的結(jié)果,感覺像是 php 7 isset 方法對(duì)對(duì)象的判斷有了變化,如果先執(zhí)行一次,$post->user->name,也就是將 user 放在 postrelations 中,這樣 isset($post->user) true,隨后 isset($post->user->name) 才為 true。

最后在 Eloquent modelgit 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 判斷的時(shí)候,會(huì)依次判斷。php5.6 則會(huì)預(yù)加載關(guān)系。其實(shí) laravel 也早就做了相關(guān)的處理,所以升級(jí) laravel 后,自然也就沒有這個(gè)問題了。

以上是升級(jí)php7后isset方法始終為 false怎么辦的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享文章:升級(jí)php7后isset方法始終為false怎么辦
文章源于:http://aaarwkj.com/article18/jjhjgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)頁設(shè)計(jì)公司、網(wǎng)站建設(shè)建站公司、全網(wǎng)營(yíng)銷推廣、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
七月丁香色婷婷婷基地| 亚洲一区二区日韩人妻| 开裆丝袜高跟啪啪高潮av| 久久蜜臀av一区三区| 国产又粗又长又大无遮挡| 一区二区三区国产精品乱码| 亚洲一区二区精品偷拍| 97日韩在线免费视频网站| 欧美欧美欧美欧美在线| 亚洲97成人在线视频| 午夜毛片免费在线播放| 亚洲一区免费在线视频| 日本精品一区二区三区免费| 国产一区二区三区精品久久| 久久五十路初次拍五十路| 亚洲成人av在线直播| 欧美一区二区日韩国产| 高清日本一区二区三区不卡片| 亚洲不卡在线免费av| 欧美性生活真实的视频| 午夜性色在线视频福利| 亚洲av少妇高潮流白浆在线| 最新国产成人免费在线视频| 国产剧情av网址观看免费| 久久麻豆精亚洲av品国产一区| 日韩精品少妇一区二区在线看| 国产毛毛片一区二区三区| 国产成人91精品免费看片| 成人在线观看一区二区三区| 丝袜美腿精尽福利视频网址大全| 国产一区二区三区在线视频播放 | 午夜在线观看视频免费| 亚洲一区二区三区黄色| 国内午夜福利精品视频| 婷婷av一区二区三区| 欧美日韩综合精品无人区| 国产一区二区三区av网站| 偷窥偷拍原味一区二区三区| 亚洲av色香蕉一区二区| 性感美女国产精品一区二区| 国产精品国产成人生活片|