首頁 > 後端開發 > php教程 > 鍵入PHP中的暗示

鍵入PHP中的暗示

Joseph Gordon-Levitt
發布: 2025-02-28 08:53:14
原創
841 人瀏覽過

Type Hinting in PHP

關鍵要點

  • PHP 的類型提示允許開發者在函數聲明中指定參數的預期數據類型,從而增強代碼的健壯性和可讀性。但是,PHP 的類型提示不支持標量數據類型,例如字符串或整數。
  • PHP 是一種弱類型語言,這意味著它不要求你聲明數據類型。在 PHP 5.4 中添加標量 PHP 類型提示一直存在爭議,反對者認為這違背了 PHP 的基本設計。儘管最初得到支持,但由於社區的回應,此功能並未進入 PHP 5.4 版本。
  • 儘管 PHP 的類型提示有限制,但當參數不是標量類型時,你可以執行基本驗證來達到此目的。在這種情況下,可以使用 is_string()is_int() 等函數來引發錯誤或拋出異常。

從 PHP 5 開始,你可以使用類型提示來指定函數聲明中參數的預期數據類型。調用函數時,PHP 將檢查參數是否為指定的類型。如果不是,運行時將引發錯誤並停止執行。有效的類型包括接收對象的類名和接收數組的 array。以下是一個示例:

<?php
function enroll(Student $student, School $school) {
    echo "Enrolling " . $student->name . " in " . $school->name;
}
?>
登入後複製

通過告訴 PHP enroll() 方法期望接收什麼類型的對象,你可以確保學生被註冊到學校而不是修道院或 401K 計劃中。同樣,你知道不會有任何頑固的厚皮動物出現在三年級的第一天。如果我試圖將自己註冊到醫療保險會發生什麼?

<?php
$me = new Student("Amanda");
$medicare = new Program("Medicare");
$enroll = enroll($me, $medicare);
?>
登入後複製

雖然我是一名學生,但會發生以下錯誤:

<code>Catchable fatal error: Argument 2 passed to enroll() must be an instance of School, instance of Program given, called in typehint.php on line 32 and defined in typehint.php on line 6</code>
登入後複製

如果使用 <cod>null 作為參數的默認值,它也將被允許。以下是一個示例,這次使用數組:

<?php
function startParty(array $guests, array $food = null) {
    // party stuff...
}
$guests = array("Susan Foreman", "Sarah Jane Smith", "Rose Tyler", "Donna Noble");
startParty($guests, null);
?>
登入後複製

只要有客人,無論有沒有食物,都會有派對。

類型提示的局限性

任何已定義的類都可以是有效的類型提示,儘管 PHP 不支持泛型對象的類型提示。其他情況呢?這是一個關於 PHP 類型提示局限性的特殊示例:

<?php
function stringTest(string $string) {
    echo $string;
}
stringTest("definitely a string");
?>
登入後複製
<code>Catchable fatal error: Argument 1 passed to stringTest() must be an instance of string, string given, called in typehint.php on line 42 and defined in typehint.php on line 39</code>
登入後複製

你不是第一個想到“這是什麼瘋狂?我給了你一個字符串實例,你卻抱怨它必須是一個字符串實例!”沒關係。這是常有的事。事實上,乍一看,這可能是一個相當令人困惑的錯誤消息。 stringTest() 並不是在尋找字符串,而是在尋找字符串類的實例。 PHP 的類型提示不支持標量數據類型,例如字符串或整數值。但是沒關係!如果你需要在參數不是標量類型(例如字符串或整數)時引發錯誤或拋出異常,可以使用 is_string()is_int() 等函數執行基本驗證來達到此目的。

標量戰爭

關於在 PHP 5.4 中添加標量 PHP 類型提示,存在一些爭議。反對更改的人認為,這種支持會違背 PHP 的基本設計。 PHP 被認為是一種弱類型語言。本質上,這意味著 PHP 不要求你聲明數據類型。變量仍然與它們關聯的數據類型相關聯,但你可以做一些激進的事情,例如將字符串添加到整數而不會導致錯誤。 2010 年 5 月,對標量類型提示的支持被添加到 PHP 主幹中。但由於社區的回應,此功能不會進入 5.4 版本。

總結

類型提示是引入 PHP 用於面向對象編程的技術(特別是用於識別捕獲異常的類型)。我鼓勵你閱讀更多關於在此處使用對象的信息。 圖片來自 Carlos E. Santa Maria / Shutterstock

PHP 類型提示常見問題解答 (FAQ)

PHP 類型提示的重要性是什麼?

PHP 中的類型提示是一個重要特性,允許開發者在函數聲明中指定參數的預期數據類型。它通過確保函數接收正確類型的數值來增強代碼的健壯性。這導致代碼中的錯誤和漏洞更少,使其更可靠且更容易調試。它還提高了代碼的可讀性,使其他開發者更容易理解代碼的功能。

我可以在 PHP 中對所有數據類型使用類型提示嗎?

PHP 支持對多種數據類型進行類型提示,包括對象、數組、接口、可調用和可迭代。但是,需要注意的是,PHP 直到 7.0 版本才支持標量類型提示(int、float、string 和 bool)。從 PHP 7.0 開始,你可以對所有數據類型使用類型提示。

如果傳遞的參數的數據類型與類型提示不匹配會發生什麼?

如果傳遞的參數的數據類型與函數聲明中的類型提示不匹配,PHP 將拋出“致命錯誤”。此錯誤將停止腳本的執行,防止任何進一步的處理。這就是為什麼必須確保將正確的數據類型傳遞給函數的原因。

PHP 類型提示如何與類繼承一起工作?

在 PHP 中,類型提示可以與類繼承一起使用。如果函數期望某個特定類類型的參數,它也將接受該類的子類的實例。這是因為子類是其父類的特定類型,因此滿足類型提示。

我可以在 PHP 的內置函數中使用類型提示嗎?

不可以,PHP 中的類型提示只能用於用戶定義的函數。 PHP 的內置函數不支持類型提示。但是,這些函數通常具有處理不同數據類型的內部機制。

PHP 類型提示中的嚴格模式是什麼?

PHP 類型提示中的嚴格模式是 PHP 7.0 中引入的一個特性。啟用嚴格模式後,PHP 將根據類型提示強制執行數據類型的精確匹配。如果傳遞的參數的數據類型與類型提示不完全匹配,即使該參數可以強制轉換為正確的類型,PHP 也會拋出“致命錯誤”。

如何在 PHP 中啟用嚴格模式?

要在 PHP 中啟用嚴格模式,你需要在 PHP 文件的頂部聲明 declare(strict_types=1);。此聲明必須是腳本中的第一個語句。

PHP 類型提示中弱模式和嚴格模式的區別是什麼?

PHP 類型提示中弱模式和嚴格模式的區別在於 PHP 如何處理類型不匹配。在弱模式下,如果可能,PHP 將嘗試將傳遞的參數強制轉換為正確的數據類型。相反,在嚴格模式下,PHP 將不會嘗試強制轉換值,如果數據類型不完全匹配,則會拋出“致命錯誤”。

我可以對函數返回值使用類型提示嗎?

是的,從 PHP 7.0 開始,你可以對函數返回值使用類型提示。此特性允許你指定函數返回值的預期數據類型,從而增強代碼的可靠性和可讀性。

PHP 中的可空類型提示是什麼?

可空類型提示是 PHP 7.1 中引入的一個特性。它允許你指定函數參數或返回值可以是指定類型或 null。要使類型提示可為空,請在類型名稱前加上問號 (?)。例如,“?string”表示該值可以是字符串或 null。

以上是鍵入PHP中的暗示的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板