【輕知識】Laravel5.2 php環(huán)境升級到php7.2

myproject升級到php7.2

laravel 5.2。本地開發(fā)環(huán)境php7.1翔烁,線上php7.0。要把php7.0升級到php7.2友驮。

目前遇到的問題就是each漂羊、count 這兩個。

1.each 廢棄
2.count 只能 countable type 的變量

以下是遇到一些小問題喊儡。做個記錄拨与。

1. ModulesServiceProvider.php The each() function is deprecated. This message will be suppressed on further calls

while (list(, $module) = each($modules)) {

            // Load the routes for each of the modules
            if (file_exists(__DIR__ . '/' . $module . '/routes.php')) {
                include __DIR__ . '/' . $module . '/routes.php';
            }

            // Load the views
            if (is_dir(__DIR__ . '/' . $module . '/Views')) {
                $this->loadViewsFrom(__DIR__ . '/' . $module . '/Views', $module);
            }
        }

php 7.2 廢棄了each 。while(...each..)改成foreah 即可

修改為

foreach ($modules as $module) {
            // Load the routes for each of the modules
            if (file_exists(__DIR__ . '/' . $module . '/routes.php')) {
                include __DIR__ . '/' . $module . '/routes.php';
            }

            // Load the views
            if (is_dir(__DIR__ . '/' . $module . '/Views')) {
                $this->loadViewsFrom(__DIR__ . '/' . $module . '/Views', $module);
            }
        }

2. ErrorException in Builder.php line 772:

count(): Parameter must be an array or an object that implements Countable

問題定位到了艾猜。in Builder.php line 772
at HandleExceptions->handleError('2', 'count(): Parameter must be an array or an object that implements Countable', 'F:\iProject\myproject\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php', '772', array('query' => object(Builder), 'boolean' => 'and'))

問題源

    public function addNestedWhereQuery($query, $boolean = 'and')
    {
        if (count($query->wheres)) {
            $type = 'Nested';

            $this->wheres[] = compact('type', 'query', 'boolean');

            $this->addBinding($query->getBindings(), 'where');
        }

        return $this;
    }

我打印 query->wheres 時候,發(fā)現(xiàn)query->wheres 為 NULL捻悯。count(NULL) 在其他版本結(jié)果為 0.

修改為

if ($query->wheres != NULL && count($query->wheres)) {
            $type = 'Nested';

            $this->wheres[] = compact('type', 'query', 'boolean');

            $this->addBinding($query->getBindings(), 'where');
        }

但是這樣就動了框架了匆赃。我以為新框架會對這段做改變。我之后下載了laravel 5.7的框架今缚。這段代碼沒變算柳。

3.當我開始測腳本的時候

$ APP_ENV="test" php72 artisan CategoryCron
count(): Parameter must be an array or an object that implements Countab

定位。在處理異常的地方打印行數(shù)與文件

int(67)
string(68) "F:\iProject\myproject\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php"

找到代碼

public function release(EasyHandle $easy)
    {
        $resource = $easy->handle;
        unset($easy->handle);

        if (count($this->handles) >= $this->maxHandles) {
            curl_close($resource);

跟上面一樣姓言。$this->handles為null所以才報錯了瞬项。兼容方式跟問題2一樣。

改框架不好何荚,還是在業(yè)務(wù)層面修改

改框架的問題就是囱淋。當你有天(或者別人)。composer update的時候餐塘。舊的框架代碼移除妥衣,新的覆蓋。你的修改又都沒了戒傻。

改了框架并沒有避免NULL傳入税手。所以要在自己寫的代碼層面去控制。

再看問題2

報錯的調(diào)用trace

in Builder.php line 772
at HandleExceptions->handleError('2', 'count(): Parameter must be an array or an object that implements Countable', 'F:\iProject\myproject\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php', '772', array('query' => object(Builder), 'boolean' => 'and'))
at count(null) in Builder.php line 772
at Builder->addNestedWhereQuery(object(Builder), 'and') in Builder.php line 778

我們看誰調(diào)用了 addNestedWhereQuery需纳,\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php里面的 where 方法調(diào)用 了$this->query->addNestedWhereQuery($query->getQuery(), $boolean);
也就是說 調(diào)用where方法要傳一個query 芦倒,然后query->getQuery(),還不能為null。

再看看業(yè)務(wù)代碼不翩,找到一些類似如下的代碼

->where(function ($query) use ($condition) {
     if (!empty($condition['title'])) {
         $query->where('page.title', 'like', '%' . $condition['title'] . '%');
     }
})
->where(function ($query) use ($condition) {
     if (!empty($condition['author'])) {
         $query->where('page.author', 'like', '%' . $condition['author'] . '%');
     } 
})

看完之后兵扬,就明白了。原因了慌盯。沒有傳條件的時候周霉,是沒有$query->where()。所以就為NULL亚皂。

修正俱箱,多個where 合并到一個where即可。再加一行代碼灭必, $query->where('page.id', '>' . 0');(這不是一個很好的解決方式狞谱,但是先讓代碼跑起來乃摹。當然我們知道了原因,怎么做有很多方式了跟衅,對吧)

->where(function ($query) use ($condition) {
     if (!empty($condition['title'])) {
         $query->where('page.title', 'like', '%' . $condition['title'] . '%');
     }
    if (!empty($condition['author'])) {
         $query->where('page.author', 'like', '%' . $condition['author'] . '%');
     } 
    $query->where('page.id', '>' . 0');
})
 
    

再看問題3

網(wǎng)上有人遇到這個問題孵睬。Crash CurlFactory:67 - PHP 7.2.0-dev

現(xiàn)在的6.3 版本是沒問題的。因為框架默認給了$handles一個[]伶跷。

class CurlFactory implements CurlFactoryInterface
{
    /** @var array */
    private $handles;

變成了如下掰读。

class CurlFactory implements CurlFactoryInterface
{
    /** @var array */
    private $handles = [];

單獨 composer update guzzlehttp/guzzle遇到了一個小問題,意思是不能單獨升級guzzle叭莫,其他依賴版本不升也不行蹈集。

所以我們可以思考一個問題。當我們寫代碼雇初,聲明屬性的時候拢肆。如果是數(shù)組那還是初始化一個[],否則某天方法中count就會報錯了靖诗。

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刊橘,一起剝皮案震驚了整個濱河市鄙才,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伤为,老刑警劉巖咒循,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绞愚,居然都是意外死亡叙甸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門位衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裆蒸,“玉大人,你說我怎么就攤上這事糖驴×诺唬” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵贮缕,是天一觀的道長辙谜。 經(jīng)常有香客問我,道長感昼,這世上最難降的妖魔是什么装哆? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上蜕琴,老公的妹妹穿的比我還像新娘萍桌。我一直安慰自己,他們只是感情好凌简,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布上炎。 她就那樣靜靜地躺著,像睡著了一般雏搂。 火紅的嫁衣襯著肌膚如雪藕施。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天畔派,我揣著相機與錄音铅碍,去河邊找鬼。 笑死线椰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的尘盼。 我是一名探鬼主播憨愉,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卿捎!你這毒婦竟也來了配紫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤午阵,失蹤者是張志新(化名)和其女友劉穎躺孝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體底桂,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡植袍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了籽懦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于个。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖暮顺,靈堂內(nèi)的尸體忽然破棺而出厅篓,到底是詐尸還是另有隱情,我是刑警寧澤捶码,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布羽氮,位于F島的核電站,受9級特大地震影響惫恼,放射性物質(zhì)發(fā)生泄漏档押。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汇荐。 院中可真熱鬧洞就,春花似錦、人聲如沸掀淘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽革娄。三九已至倾贰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拦惋,已是汗流浹背匆浙。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厕妖,地道東北人首尼。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像言秸,于是被迫代替她去往敵國和親软能。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,448評論 0 13
  • Overview The ccxt library is a collection of available cr...
    郭蟈兒蟈兒閱讀 3,671評論 0 1
  • php7發(fā)布已經(jīng)升級到7.2.里面發(fā)生了很多的變化举畸。本文整理php7.0至php7.2的新特性和一些變化查排。 參考資...
    盤木閱讀 1,399評論 1 2
  • 念,墨硯抄沮,紙上戀跋核,三月難見,對鏡妝花鈿叛买,待得來日相見砂代,看一場煙花璀璨。 憶聪全,如蜜泊藕,荷塘碧,姑娘玉立难礼,你姿容清逸娃圆,空...
    笙笙不兮閱讀 451評論 8 11
  • 感恩節(jié)(Thanksgiving Day)是美國人民獨創(chuàng)的一個古老節(jié)日讼呢,也是美國人合家歡聚的節(jié)日。 初時感恩節(jié)沒有...
    陌影笙閱讀 292評論 2 3