国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Migration auf PHP 8.1 – So beheben Sie den veralteten Fehler bei der übergabe von Null an Parameter – Benennen Sie die Build-in-Funktion um
P粉420868294
P粉420868294 2024-01-10 16:21:21
0
2
713

In PHP 8.1 veraltet null 作為參數(shù)傳遞給許多核心函數(shù)。我的主要問題是 htmlspecialchars(php)trim(php) 等函數(shù),其中 null nicht mehr stillschweigend in einen leeren String konvertiert.

Um dieses Problem zu l?sen, ohne viel Code zu verwenden, habe ich versucht, die ursprünglich integrierten Funktionen umzubenennen und sie durch Wrapper zu ersetzen, die die Eingabe von null in einen (leeren) String konvertieren.

Das Hauptproblem bei diesem Ansatz besteht darin, dass die Funktion rename_function(PECL apd) nicht mehr funktioniert, sie wurde zuletzt im Jahr 2004 1 aktualisiert.

Ich muss die integrierten Funktionen neu schreiben, um zu vermeiden, dass bei jedem Aufruf der Funktion eine Nullprüfung geschrieben wird, wodurch mein gesamter Code doppelt so gro? wird.

Die einzige andere L?sung, die mir einf?llt, besteht darin, einfach meine benutzerdefinierte Funktion zu verwenden, aber dafür muss ich immer noch den gesamten Code und die Bibliotheken von Drittanbietern durchgehen, die ich habe.

In PHP 8.1 wird null nicht mehr stillschweigend in eine leere Zeichenfolge umgewandelt, wenn es an eine integrierte Funktion übergeben wird.


  1. https://pecl.php.net/package/apd

P粉420868294
P粉420868294

Antworte allen(2)
P粉811329034

我想(作為補充,現(xiàn)有的答案得到了我的支持)就如何看待和解決此類“問題”描繪了一幅不同的圖畫。它并沒有減少所概述的方法的正確性或錯誤性,而只是一種希望互惠互利的附加觀點。每個項目都是不同的。

給定前提:

那么這對我來說(首先)看起來是一個報告問題。通過不報告 E_DEPRECATED

這樣做的好處是(不僅是您的代碼),現(xiàn)在知道您的代碼帶有棄用通知。報告確實有效

另一方面,壓制棄用通知可能會讓它們消失。如果您丟失了代碼庫帶有棄用通知的信息,從技術(shù)上講,從信息丟失中恢復可能仍然很容易(再次報告棄用通知),但是如果更改的時間延長了,現(xiàn)在可能會出現(xiàn)壓倒性的噪音 (E_TOO_MUCH_NOISE)。

那么代碼不沉默實際上是一件壞事嗎?或者說可以轉(zhuǎn)化為利益嗎?我寧愿選擇后者。不管怎樣,我們已經(jīng)在處理這些信息了。

因此,在這種情況中,我的想法是一般不抑制棄用通知,而是“靜默”函數(shù)調(diào)用。這很容易,但無論從好的方面還是從壞的方面來說,這都是愚蠢的:

trim($mixed);   #1  ->     @trim($mixed);   #2

這當然是一個可以使用標準文本工具應(yīng)用于代碼庫的操作。它還會向您顯示過去已經(jīng)使用過 @ 抑制運算符的位置:

@trim($mixed);  #3  ->     @@trim($mixed);  #4

如果您是一名 PHP 開發(fā)人員,在編輯器中查看此類代碼(對于情況#2-#4),他們會立即向您尖叫,并且對于所有四種情況至少都會引起您的注意($mixed)。

感謝您沒有保持沉默,我們讓這些地方尖叫,只是不是在運行時1。

與第一種通過不報告 E_DEPRECATED 來保持沉默的方法不同,這種方法很容易丟失信息,而信息是通過使用所有 @ 符號來保存的。

它對解決噪音問題有幫助嗎?如果我們停止在這里工作,那就完全不行了?,F(xiàn)在我們會在代碼上涂上@-符號,決定不采取進一步的操作,這樣我們就可以使用第一個解決方案(不報告棄用消息)來完成它,而無需觸及代碼。 p>

那么它的好處是什么?好吧,盡管代碼現(xiàn)在靜默運行,PHP 仍然提供診斷消息。也就是說,現(xiàn)在可以將 PHP 錯誤處理程序注冊為偵聽器(在執(zhí)行代碼時)。

僅在代碼級別,很容易檢查這些位置,因為 @ 符號(通常)也很容易在代碼中發(fā)現(xiàn)。

第二部分很重要,因為盡管多個地方可能會受到棄用的影響,但一定不能有一個解決方案來解決所有問題(我更喜歡遠離“一刀切” '解決方案'”(如果可能的話),但特別是在問題上下文中 PHP 8.1 發(fā)生了變化,我可以想象根據(jù)使用地點會有不同的需求。

例如,在模板代碼(輸出)中,具體類型不是一個問題,因此轉(zhuǎn)換為字符串很可能是首選解決方案:

@trim($mixed);     ->     trim((string)$mixed)
@@trim($mixed);    ->     @trim((string)$mixed)

模板(輸出)保持穩(wěn)定。

但對于實際的輸入處理,棄用通知可能會發(fā)現(xiàn)值得修復的實際潛在缺陷,例如缺少默認值(使事情變得過于復雜)、值的處理不明確(空與空、字符串、布爾與數(shù)字)與 PHP 中的數(shù)組與對象)或一般的 $mixed 混淆。

這樣的 trim($mixed) 可能是一個被遺忘多年的安全防護,從未進行過升級(有更好的安全防護可用)。對于這樣的代碼,我很確定我已經(jīng)想要并要求 $mixed 實際上是 $string before 我使用 trim ()。原因很簡單,至少直接想到兩件事:

  • a) 不再需要 trim() - 它可以被刪除(我最喜歡的修復之一:刪除代碼?。?- 或 -李>
  • b)它正在進行字符串工作,那么我有一個問題,因為我不希望有任何非字符串的東西存在。問題在于,它通常不適用于霰彈槍方法(Gie?kanne 有人嗎?)。

使用 $mixed 進行修補是完全有效的? ''如果原始使用是字符串或null。

@trim($mixed);     ->     trim($mixed ?? '')
@@trim($mixed);    ->     @trim($mixed ?? '')

但除此之外,例如像 42 這樣的數(shù)字,將拋出 TypeError,而不是棄用消息。這可以區(qū)分正在運行的代碼和未運行的代碼。

因此,這里還有更多需要維護的地方,例如檢查位置,如果可能的話進一步聚類,然后應(yīng)用更多專用修復程序。它可能會揭示缺失的測試或斷言,需要一些時間來穩(wěn)定整個應(yīng)用程序流程等。

在這種情況下,要完成代碼的遷移,進行集群,處理空合并運算符,并為真正的修復做適當?shù)奈臅ぷ鳌R坏┩瓿闪耸褂每蘸喜⑦\算符的非明顯錯誤抑制并刪除了 @ 抑制運算符,如果修復計劃未捕獲這些信息,您可能會丟失這些信息。

當我在這些地方看起來受過更多教育時,當我發(fā)現(xiàn)自己撓頭或揉眼睛時,我并不感到驚訝。然后我提醒自己,這些錯誤不是因為 PHP 8.1 版本造成的,版本更改只是讓它們(再次)出現(xiàn),有時我什至會通過維護 PHP 版本來獲得完整的錯誤集群作為副漁獲物。

備忘單

  • (string)$mixed - 之前的行為
  • $mixed ?? '' - 僅在 null 上抑制 TypeError 錯誤
  • @ - 完全錯誤抑制。您應(yīng)該在適用的地方記錄您的代碼庫。
  • @@ - 如果出現(xiàn)這種情況,這可能是一個值得研究的有趣地方。
  • 空($mixed)? '' : xxx($mixed) - 把垃圾帶出去,典型的空癱/混合混亂,尋找集群,有機會大大簡化代碼庫。遷移到標量類型(PHP 7),從最內(nèi)向外引入嚴格的類型處理,在適用的情況下使用 PHP“經(jīng)典”和“嚴格”類型處理。 PHP 7.0 斷言和 PHP 8.1 棄用消息可以很好地支持這里。

錯誤處理程序

錯誤處理沒有什么魔力,它是 PHP.net 上記錄的標準(與 Example #1),它作為錯誤事件的觀察者,可以區(qū)分受抑制的錯誤和非受抑制的錯誤通過 error_reporting(php) / error_reporting(php-ini) 至少達到通常需要的級別,如果需要進行區(qū)分(在生產(chǎn)環(huán)境中,E_DEPRECATED 通常不是報告的一部分)。此示例性處理程序會拋出所有報告的錯誤,對于棄用事件以及 E_ALL 也會拋出此類錯誤,因此需要 @ 抑制運算符不拋出:

set_error_handler(static function ($type, $message, $file, $line) use (&$deprecations) {
    if (!(error_reporting() & $type)) {
        // This error code is not included in error_reporting, so let it fall
        // through to the standard PHP error handler

        // capture E_DEPRECATED
        if ($type === E_DEPRECATED) {
            $deprecations[] =
                ['deprecations' => count($deprecations ?: [])]
                + get_defined_vars();
        }

        return false;
    }

    // throwing error handler, stand-in for own error reporter
    // which may also be `return false;`
    throw new ErrorException($message, $type, error_reporting(), $file, $line);
});

類似的錯誤處理程序可以在 3v4l.org 上的擴展示例中找到,包括要報告的已棄用代碼上。

E_USER_DEPRECATED

從技術(shù)上講,錯誤抑制運算符可以與 E_USER_DEPRECATED 結(jié)合使用,與上面 E_DEPRECATED 概述的相同。

但是,對它的控制較少并且它可能已被項目依賴項中已有的第三方代碼使用。類似下面的代碼并不罕見:

@trigger_error('this. a message.', E_USER_DEPRECATED);

它的作用完全相同:發(fā)出棄用事件,但將它們從 PHP 報告中排除。訂閱這些內(nèi)容可能會讓您陷入噪音之中。使用 E_DEPRECATED,您總是可以直接從 PHP 獲得“好的、原創(chuàng)的”。


  1. 當考慮使用 @ 錯誤抑制運算符的方法并對其進行評論時,IMSoP 立即舉起紅/黑旗(正確?。苋菀讓雰号c洗澡水一起倒掉@ 抑制運算符。在我的回答中,它的目的只是抑制棄用通知但是使用的結(jié)果是它抑制所有診斷消息和錯誤,在某些 PHP 版本中甚至是致命的消息和錯誤,因此 PHP 退出 255,無需任何進一步的診斷 - 不僅要小心,還要處理。這個運營商很強大。跟蹤它在代碼庫中的使用情況并不斷檢查它是否符合您的基線/期望。對于合法情況,請考慮使用消音器。為了移植/維護代碼,首先使用它來標記。完成批量編輯后,再次將其刪除。
P粉592085423

首先,要記住兩件事:

  1. PHP 8.1 棄用這些調(diào)用,它不會使它們出錯。棄用的目的是提前通知作者修復他們的代碼,因此您和您使用的庫的作者可以在 PHP 9.0 發(fā)布之前修復問題。因此,不要驚慌,因為并非所有問題都能立即修復,并對庫維護人員保持耐心,他們會在自己的時間解決這個問題。
  2. 大多數(shù)情況下的快速解決方法是使用 空合并運算符來提供適當?shù)哪J值,因此您不需要在每次使用時進行長時間的空檢查。例如,htmlspecialchars($something) 可以替換為 htmlspecialchars($something ?? '')

接下來,一些選項:

  • 根據(jù)您的案例數(shù)量,您也許可以一次手動修復幾個問題,或者添加 ?? '' 或修復一個邏輯錯誤,無論如何你都不希望出現(xiàn) null。
  • 創(chuàng)建 nullable_htmlspecialchars 等自定義函數(shù),并在代碼中直接查找和替換。
  • 創(chuàng)建自定義命名空間函數(shù),例如 nullableoverride\htmlspecialchars;然后在添加 use function nullableoverride\htmlspecialchars; 的任何文件中,將使用該函數(shù)而不是內(nèi)置函數(shù)。不過,這必須添加到每個文件中,因此您可能需要一個工具來自動添加它。
  • 使用Rector自動添加?? '' 到適當?shù)暮瘮?shù)調(diào)用,因此您不必手動編輯它們。不幸的是,似乎還沒有這方面的內(nèi)置規(guī)則,因此您必須學會編寫自己的規(guī)則。
  • 可能更簡單,根據(jù)您的技能,使用正則表達式查找和替換來添加 ?? ''到簡單的情況。
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage