国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP 批斗大會之缺失的異常

guqiu / 2963人閱讀

摘要:背后性能影響還是挺大的。缺失的異常剛開始寫代碼的時候一直不明白為什么要用異常,感覺就能搞定了,為什么還要多此一舉,現在反而覺得的異常太少。在的時候,如果出現異常,可以通過來獲取。

作為一名深度 phper,我如果要黑咱們 php,就像說自己母校差一樣,大家不要見外。
個人博客地址:https://mengkang.net/1368.html
故事的開始

這幾天觀察錯誤日志發現有一個數據反序列化的notice錯誤,實際情況我是從緩存中讀取數據然后反序列化,因為反序列化失敗,所以實際每次都是去數據庫取的值。背后性能影響還是挺大的。

缺失的異常

剛開始寫代碼的時候一直不明白為什么要用異常,感覺if else就能搞定了,為什么還要多此一舉,現在反而覺得 php 的異常太少。

對比兩種序列化場景,一個是json,另一個是serialize

json

json encode/decode的時候,如果出現異常,可以通過json_last_error()來獲取。

https://www.php.net/manual/en...

這樣的設計只能說勉強夠用,不太符合面向對象的套路。

serialize/unserialize

在使用自帶的序列化和反序列化的時候,相比json的處理,則更加簡單粗暴,沒有函數能拿到最后的錯誤,只會通過自定義的error handler來接管,然后自己去做出一些相應的處理。

為什么要捕獲異常

比如我的代碼比較亂,有的 key 是 json 序列化,有的 key 是 serialize。我們可以將 key 分類。不能確保其他人配置的對應關系是對的,或者有的人忘記了,所以我需要用捕獲異常的方式來兜底,這樣我們的代碼更加健壯一些。unserialize失敗之后,我們可以嘗試去json_decode,而不是立即返回一個false,從而把請求傳遞到數據庫。

代碼演示
error_reporting(E_ALL);

$a = ["a" => 1];

class UnSerializeException extends ErrorException
{

}

set_error_handler(function ($severity, $message, $file, $line) {
    $info = explode(":", $message);

    if ($severity == E_NOTICE) {
        if ($info[0] == "unserialize()") {
            throw new UnSerializeException($message);
        }
        return true;
    } else {

        throw new ErrorException($message, 0, $severity, $file, $line);;
    }
});


try {
    $b = unserialize(json_encode($a));
} catch (ErrorException $exception) {
    var_dump(get_class($exception), $exception->getMessage(), $exception->getTraceAsString()); // 捕獲到了
} finally {
    restore_error_handler();
}

try {
    $b = unserialize(json_encode($a));
} catch (ErrorException $exception) {
    var_dump(get_class($exception), $exception->getMessage(), $exception->getTraceAsString()); // 無法捕獲
}

輸出結果

string(20) "UnSerializeException"
string(43) "unserialize(): Error at offset 0 of 7 bytes"
string(181) "#0 [internal function]: {closure}(8, "unserialize(): ...", "/Users/mengkang...", 34, Array)
#1 /Users/mengkang/PhpstormProjects/xxx/test.php(34): unserialize("{"a":1}")
#2 {main}"

Notice: unserialize(): Error at offset 0 of 7 bytes in /Users/mengkang/PhpstormProjects/xxx/test.php on line 42
后記

所以 php 代碼的異常設計還是任重而道遠的,而這些已經設定的“舊的規范”要推翻,需要“勇氣”,畢竟會影響所有的使用者。

很多群里老是有語言之爭的聊天,我一般都看看罷了,也不參與。類似的例子,不勝枚舉,后面我會持續輸出一些 php 自黑的博客,希望 php 代碼更加健壯、安全。也希望大家不要只看到 php 干活快,快的背后隱藏著無數的潛在風險,php 雖好,但是也不能貪杯哦。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/31739.html

相關文章

  • PHP小知識點

    摘要:那些瑣碎的知識點作者記錄的的很奇特很難記的知識點。易錯知識點整理注意和的區別中和都是輸出的作用,但是兩者之間還是有細微的差別。今天手頭不忙,總結一下,分享過程中掌握的知識點。 深入理解 PHP 之:Nginx 與 FPM 的工作機制 這篇文章從 Nginx 與 FPM 的工作機制出發,探討配置背后的原理,讓我們真正理解 Nginx 與 PHP 是如何協同工作的。 PHP 那些瑣碎的知識...

    hover_lew 評論0 收藏0
  • 深度學習是否以蠻力取勝?

    摘要:第一條是關于深度學習的晚宴,討論的是背后的數學支撐,以及未來的方向。大數據與深度學習是一種蠻力盡管當場說了很多觀點,但是最核心的還是援引了愛因斯坦關于上帝的隱喻。不過,我自己并不同意深度學習必須等同于機器蠻力。 Vladimir Vapnik 介紹:Vladimir Vapnik 被稱為統計學習理論之父,他出生于俄羅斯,1990 年底移居美國,在美國貝爾實驗室一直工作到 2002 年,之后加...

    CarlBenjamin 評論0 收藏0
  • 大數據與深度學習是一種蠻力?

    摘要:進一步說,如果承認深度學習系統在解決問題時不可思議的表現,那么大數據和深度學習,都有某種蠻力的味道。不過,我自己并不同意深度學習必須等同于機器蠻力。 Facebook去年底挖來了一個機器學習大神Vladimir Vapnik,他是統計學習理論和支持向量機的主要發明者。Vladimir Vapnik被稱為統計學習理論之父,他出生于俄羅斯,1990年底移居美國,在美國貝爾實驗室一直工作到2002...

    lidashuang 評論0 收藏0
  • 大數據與深度學習是一種蠻力?

    摘要:大數據與深度學習是一種蠻力盡管當場說了很多觀點,但是最核心的還是援引了愛因斯坦關于上帝的隱喻。大數據與深度學習是一種蠻力在算法和模型上,我們是否能發明所有東西認為,在機器學習的算法和模型上,我們并不能發明所有東西。 Facebook去年底挖來了一個機器學習大神Vladimir Vapnik,他是統計學習理論和支持向量機的主要發明者。Vladimir Vapnik被稱為統計學習理論之父,他出生...

    yankeys 評論0 收藏0
  • 阿里巴巴發布智能運維故障管理AI+生態計劃

    摘要:開放生態計劃,回饋社會阿里巴巴全球運行指揮中心掌門人沈乘黃首先分享了智能運維在阿里巴巴線上故障管理領域的應用經驗。 摘要: 為響應馬老師家國情懷,世界擔當的號召,開放AI+生態計劃,將讓集團內部服務過程中積累下的技術與經驗更好地回饋社會,任何企業或合作伙伴均可以簡單方便的接入阿里巴巴智能故障管理平臺,通過對接入數據的訓練學習實時提供異常檢測、關聯分析、根因定位的能力,使原有的IT管理模...

    codecraft 評論0 收藏0

發表評論

0條評論

guqiu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<