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

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</cod> 作為參數的默認值,它也將被允許。以下是一個示例,這次使用數組:

<?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
PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

您如何從PHP會話中檢索數據?您如何從PHP會話中檢索數據?May 01, 2025 am 12:11 AM

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

您如何使用會議來實施購物車?您如何使用會議來實施購物車?May 01, 2025 am 12:10 AM

利用會話構建高效購物車系統的步驟包括:1)理解會話的定義與作用,會話是服務器端的存儲機制,用於跨請求維護用戶狀態;2)實現基本的會話管理,如添加商品到購物車;3)擴展到高級用法,支持商品數量管理和刪除;4)優化性能和安全性,通過持久化會話數據和使用安全的會話標識符。

您如何在PHP中創建和使用接口?您如何在PHP中創建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解釋瞭如何創建,實施和使用PHP中的接口,重點關注其對代碼組織和可維護性的好處。

crypt()和password_hash()有什麼區別?crypt()和password_hash()有什麼區別?Apr 30, 2025 pm 03:39 PM

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

如何防止PHP中的跨站點腳本(XSS)?如何防止PHP中的跨站點腳本(XSS)?Apr 30, 2025 pm 03:38 PM

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境