關(guān)鍵要點(diǎn)
- PHP 的類型提示允許開發(fā)者在函數(shù)聲明中指定參數(shù)的預(yù)期數(shù)據(jù)類型,從而增強(qiáng)代碼的健壯性和可讀性。但是,PHP 的類型提示不支持標(biāo)量數(shù)據(jù)類型,例如字符串或整數(shù)。
- PHP 是一種弱類型語言,這意味著它不要求你聲明數(shù)據(jù)類型。在 PHP 5.4 中添加標(biāo)量 PHP 類型提示一直存在爭議,反對(duì)者認(rèn)為這違背了 PHP 的基本設(shè)計(jì)。盡管最初得到支持,但由于社區(qū)的回應(yīng),此功能并未進(jìn)入 PHP 5.4 版本。
- 盡管 PHP 的類型提示有限制,但當(dāng)參數(shù)不是標(biāo)量類型時(shí),你可以執(zhí)行基本驗(yàn)證來達(dá)到此目的。在這種情況下,可以使用
is_string()
或is_int()
等函數(shù)來引發(fā)錯(cuò)誤或拋出異常。
從 PHP 5 開始,你可以使用類型提示來指定函數(shù)聲明中參數(shù)的預(yù)期數(shù)據(jù)類型。調(diào)用函數(shù)時(shí),PHP 將檢查參數(shù)是否為指定的類型。如果不是,運(yùn)行時(shí)將引發(fā)錯(cuò)誤并停止執(zhí)行。有效的類型包括接收對(duì)象的類名和接收數(shù)組的 array
。以下是一個(gè)示例:
<?php function enroll(Student $student, School $school) { echo "Enrolling " . $student->name . " in " . $school->name; } ?>
通過告訴 PHP enroll()
方法期望接收什么類型的對(duì)象,你可以確保學(xué)生被注冊(cè)到學(xué)校而不是修道院或 401K 計(jì)劃中。同樣,你知道不會(huì)有任何頑固的厚皮動(dòng)物出現(xiàn)在三年級(jí)的第一天。如果我試圖將自己注冊(cè)到醫(yī)療保險(xiǎn)會(huì)發(fā)生什么?
<?php $me = new Student("Amanda"); $medicare = new Program("Medicare"); $enroll = enroll($me, $medicare); ?>
雖然我是一名學(xué)生,但會(huì)發(fā)生以下錯(cuò)誤:
<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
作為參數(shù)的默認(rèn)值,它也將被允許。以下是一個(gè)示例,這次使用數(shù)組:
<?php function startParty(array $guests, array $food = null) { // party stuff... } $guests = array("Susan Foreman", "Sarah Jane Smith", "Rose Tyler", "Donna Noble"); startParty($guests, null); ?>
只要有客人,無論有沒有食物,都會(huì)有派對(duì)。
類型提示的局限性
任何已定義的類都可以是有效的類型提示,盡管 PHP 不支持泛型對(duì)象的類型提示。其他情況呢?這是一個(gè)關(guān)于 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>
你不是第一個(gè)想到“這是什么瘋狂?我給了你一個(gè)字符串實(shí)例,你卻抱怨它必須是一個(gè)字符串實(shí)例!”沒關(guān)系。這是常有的事。事實(shí)上,乍一看,這可能是一個(gè)相當(dāng)令人困惑的錯(cuò)誤消息。stringTest()
并不是在尋找字符串,而是在尋找字符串類的實(shí)例。PHP 的類型提示不支持標(biāo)量數(shù)據(jù)類型,例如字符串或整數(shù)值。但是沒關(guān)系!如果你需要在參數(shù)不是標(biāo)量類型(例如字符串或整數(shù))時(shí)引發(fā)錯(cuò)誤或拋出異常,可以使用 is_string()
或 is_int()
等函數(shù)執(zhí)行基本驗(yàn)證來達(dá)到此目的。
標(biāo)量戰(zhàn)爭
關(guān)于在 PHP 5.4 中添加標(biāo)量 PHP 類型提示,存在一些爭議。反對(duì)更改的人認(rèn)為,這種支持會(huì)違背 PHP 的基本設(shè)計(jì)。PHP 被認(rèn)為是一種弱類型語言。本質(zhì)上,這意味著 PHP 不要求你聲明數(shù)據(jù)類型。變量仍然與它們關(guān)聯(lián)的數(shù)據(jù)類型相關(guān)聯(lián),但你可以做一些激進(jìn)的事情,例如將字符串添加到整數(shù)而不會(huì)導(dǎo)致錯(cuò)誤。2010 年 5 月,對(duì)標(biāo)量類型提示的支持被添加到 PHP 主干中。但由于社區(qū)的回應(yīng),此功能不會(huì)進(jìn)入 5.4 版本。
總結(jié)
類型提示是引入 PHP 用于面向?qū)ο缶幊痰募夹g(shù)(特別是用于識(shí)別捕獲異常的類型)。我鼓勵(lì)你閱讀更多關(guān)于在此處使用對(duì)象的信息。圖片來自 Carlos E. Santa Maria / Shutterstock
PHP 類型提示常見問題解答 (FAQ)
PHP 類型提示的重要性是什么?
PHP 中的類型提示是一個(gè)重要特性,允許開發(fā)者在函數(shù)聲明中指定參數(shù)的預(yù)期數(shù)據(jù)類型。它通過確保函數(shù)接收正確類型的數(shù)值來增強(qiáng)代碼的健壯性。這導(dǎo)致代碼中的錯(cuò)誤和漏洞更少,使其更可靠且更容易調(diào)試。它還提高了代碼的可讀性,使其他開發(fā)者更容易理解代碼的功能。
我可以在 PHP 中對(duì)所有數(shù)據(jù)類型使用類型提示嗎?
PHP 支持對(duì)多種數(shù)據(jù)類型進(jìn)行類型提示,包括對(duì)象、數(shù)組、接口、可調(diào)用和可迭代。但是,需要注意的是,PHP 直到 7.0 版本才支持標(biāo)量類型提示(int、float、string 和 bool)。從 PHP 7.0 開始,你可以對(duì)所有數(shù)據(jù)類型使用類型提示。
如果傳遞的參數(shù)的數(shù)據(jù)類型與類型提示不匹配會(huì)發(fā)生什么?
如果傳遞的參數(shù)的數(shù)據(jù)類型與函數(shù)聲明中的類型提示不匹配,PHP 將拋出“致命錯(cuò)誤”。此錯(cuò)誤將停止腳本的執(zhí)行,防止任何進(jìn)一步的處理。這就是為什么必須確保將正確的數(shù)據(jù)類型傳遞給函數(shù)的原因。
PHP 類型提示如何與類繼承一起工作?
在 PHP 中,類型提示可以與類繼承一起使用。如果函數(shù)期望某個(gè)特定類類型的參數(shù),它也將接受該類的子類的實(shí)例。這是因?yàn)樽宇愂瞧涓割惖奶囟愋?,因此滿足類型提示。
我可以在 PHP 的內(nèi)置函數(shù)中使用類型提示嗎?
不可以,PHP 中的類型提示只能用于用戶定義的函數(shù)。PHP 的內(nèi)置函數(shù)不支持類型提示。但是,這些函數(shù)通常具有處理不同數(shù)據(jù)類型的內(nèi)部機(jī)制。
PHP 類型提示中的嚴(yán)格模式是什么?
PHP 類型提示中的嚴(yán)格模式是 PHP 7.0 中引入的一個(gè)特性。啟用嚴(yán)格模式后,PHP 將根據(jù)類型提示強(qiáng)制執(zhí)行數(shù)據(jù)類型的精確匹配。如果傳遞的參數(shù)的數(shù)據(jù)類型與類型提示不完全匹配,即使該參數(shù)可以強(qiáng)制轉(zhuǎn)換為正確的類型,PHP 也會(huì)拋出“致命錯(cuò)誤”。
如何在 PHP 中啟用嚴(yán)格模式?
要在 PHP 中啟用嚴(yán)格模式,你需要在 PHP 文件的頂部聲明 declare(strict_types=1);
。此聲明必須是腳本中的第一個(gè)語句。
PHP 類型提示中弱模式和嚴(yán)格模式的區(qū)別是什么?
PHP 類型提示中弱模式和嚴(yán)格模式的區(qū)別在于 PHP 如何處理類型不匹配。在弱模式下,如果可能,PHP 將嘗試將傳遞的參數(shù)強(qiáng)制轉(zhuǎn)換為正確的數(shù)據(jù)類型。相反,在嚴(yán)格模式下,PHP 將不會(huì)嘗試強(qiáng)制轉(zhuǎn)換值,如果數(shù)據(jù)類型不完全匹配,則會(huì)拋出“致命錯(cuò)誤”。
我可以對(duì)函數(shù)返回值使用類型提示嗎?
是的,從 PHP 7.0 開始,你可以對(duì)函數(shù)返回值使用類型提示。此特性允許你指定函數(shù)返回值的預(yù)期數(shù)據(jù)類型,從而增強(qiáng)代碼的可靠性和可讀性。
PHP 中的可空類型提示是什么?
可空類型提示是 PHP 7.1 中引入的一個(gè)特性。它允許你指定函數(shù)參數(shù)或返回值可以是指定類型或 null。要使類型提示可為空,請(qǐng)?jiān)陬愋兔Q前加上問號(hào) (?)。例如,“?string”表示該值可以是字符串或 null。
以上是鍵入PHP中的暗示的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機(jī)

Video Face Swap
使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)代碼編輯軟件(SublimeText3)

PHP變量作用域常見問題及解決方法包括:1.函數(shù)內(nèi)部無法訪問全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次并在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過濾;4.匿名函數(shù)需通過use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助于避免錯(cuò)誤并提升代碼穩(wěn)定性。

要安全處理PHP文件上傳需驗(yàn)證來源與類型、控制文件名與路徑、設(shè)置服務(wù)器限制并二次處理媒體文件。1.驗(yàn)證上傳來源通過token防止CSRF并通過finfo_file檢測(cè)真實(shí)MIME類型使用白名單控制;2.重命名文件為隨機(jī)字符串并根據(jù)檢測(cè)類型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪問上傳目錄;4.GD庫重新保存圖片清除潛在惡意數(shù)據(jù)。

PHP注釋代碼常用方法有三種:1.單行注釋用//或#屏蔽一行代碼,推薦使用//;2.多行注釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧注釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

寫好PHP注釋的關(guān)鍵在于明確目的與規(guī)范,注釋應(yīng)解釋“為什么”而非“做了什么”,避免冗余或過于簡單。1.使用統(tǒng)一格式,如docblock(/*/)用于類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背后的原因,如說明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便于后續(xù)追蹤與協(xié)作。好的注釋能降低溝通成本,提升代碼維護(hù)效率。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

在PHP中獲取字符串特定索引字符可用方括號(hào)或花括號(hào),但推薦方括號(hào);索引從0開始,超出范圍訪問返回空值,不可賦值;處理多字節(jié)字符需用mb_substr。例如:$str="hello";echo$str[0];輸出h;而中文等字符需用mb_substr($str,1,1)獲取正確結(jié)果;實(shí)際應(yīng)用中循環(huán)訪問前應(yīng)檢查字符串長度,動(dòng)態(tài)字符串需驗(yàn)證有效性,多語言項(xiàng)目建議統(tǒng)一使用多字節(jié)安全函數(shù)。

易于效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)
