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

首頁 後端開發(fā) php教程 動態(tài)語言中靜態(tài)型別的諷刺

動態(tài)語言中靜態(tài)型別的諷刺

Nov 03, 2024 am 06:28 AM

您也可以在 Medium 上閱讀這篇文章。

當(dāng)我們看到程式語言如何隨著時間的推移而演變時,總是很有趣。

曾幾何時,當(dāng)我開始進入軟體開發(fā)世界時,Python、PHP 和 JavaScript 等動態(tài)語言因其靈活性和適合快速開發(fā)的簡潔語法而受到讚賞。

然而,隨著這些弱型別語言的發(fā)展,它們?nèi)诤狭藦娦蛣e語言的特性,使它們與 C 和 Java 非常相似:

  • Python:自 2015 年版本 3.5 開始引入類型提示功能,並在 2022 年版本 3.12 中增強。
  • PHP:2015 年版本 7 中引入的聲明類型。
  • JavaScript:透過 2012 年 TypeScript 的發(fā)布進行了擴展,定義為「具有類型語法的 JavaScript」。

為什麼會有這樣的轉(zhuǎn)變?

在嚴(yán)格型別語言中,我們在程式碼中明確定義變數(shù)的型別。目標(biāo)是在執(zhí)行程式之前捕獲開發(fā)階段的錯誤,並向編譯器提供有關(guān)分配給這些變數(shù)的記憶體大小的提示。

// C++ example: 'y' will be an integer
float x = 3.14;
int y = x;  //  y = 3 (ignored the decimal part of the number)

另一方面,動態(tài)類型語言(例如 Python、PHP 和 JavaScript)允許我們建立變數(shù)並讓解釋器在執(zhí)行時間暗示它們的類型:

# In python and PHP: 'y' will take the same type as 'x'
x = 3.14
y = x  // y = 3.14 (float)

動態(tài)語言中如何引入顯式類型?

在下面的範(fàn)例中,我們使用動態(tài)和靜態(tài)類型來聲明相同的函數(shù)。

Python:

# using the classic syntax:
def add(x, y):
    return x + y
# using explicit typing:
def add(x: int, y:int) -> int:
    return x + y

JavaScript / TypeScript:

// using the classic syntax
function add(x, y) {
    return x + y;
}
// using explicit typing
function add(x: number, y: number): number {
    return x + y;
}

PHP:

// using the classic syntax:
function add($x, $y) {
    return $x + $y;
}
// using explicit typing:
function add(int $x, int $y): int {
    return $x + $y;
}

PHP 8.2(於 2022 年 12 月發(fā)布)透過引入對 null、true 和 false 作為獨立類型的支援來進一步推動它:

public null $nil = null;
public false $false = false;`

諷刺在哪裡?

不要將這篇文章視為對這些新功能的反對,我確實承認(rèn)使用嚴(yán)格類型語言的優(yōu)勢。然而,例如,在 Python 中使用類型註解並不能阻止您更改變數(shù)的類型:

x: int = 0
x = "John" 
print(type(x))   # <class 'str'>

PHP 也是一樣,它只會在控制臺上列印 Deprecated 警告。

有人可能會問為什麼解釋器允許我們執(zhí)行這段程式碼?
這是因為這些語言是這樣建構(gòu)的:它們根據(jù)定義是動態(tài)類型的。 如果我們刪除這個特性,它們將不再是動態(tài)的;它們將成為像 C 一樣的嚴(yán)格類型語言,但速度較慢。

希望您可以透過在 PHP 檔案中將 strict_types 設(shè)為 true 來要求解釋器更加嚴(yán)格:

declare(strict_types=1);

在 python 中,您可以使用「mypy」套件來分析程式碼並捕獲錯誤:

// C++ example: 'y' will be an integer
float x = 3.14;
int y = x;  //  y = 3 (ignored the decimal part of the number)

您可以看到「mypy」作為顧問,告訴您做錯了什麼,但這並不能阻止您執(zhí)行程式碼,風(fēng)險由您承擔(dān)。

The Irony of Static Typing in Dynamic Languages

即使您不確定變數(shù)的類型,您仍然可以使用聯(lián)合運算子來減少接受類型的清單:

以下來自 PHP 和 Python 的範(fàn)例展示瞭如何做到這一點:

# In python and PHP: 'y' will take the same type as 'x'
x = 3.14
y = x  // y = 3.14 (float)

我們是否犧牲了程式碼的可讀性?

十年前,我決定使用 Python 攻讀博士學(xué)位,因為它簡單且能夠快速建立新想法原型。然後我也開始將它用於我的其他項目。

現(xiàn)在,我發(fā)現(xiàn)自己閱讀了一些奇怪的 PEP,並質(zhì)疑自己是否真的值得透過包含這些新功能來使我的程式碼庫複雜化。

讓我們來看一個列印字典項目的範(fàn)例函數(shù)。這是初始版本:

# using the classic syntax:
def add(x, y):
    return x + y
# using explicit typing:
def add(x: int, y:int) -> int:
    return x + y

透過使用 Python 3.12 中引入的 PEP 692 的建議,程式碼變成:

// using the classic syntax
function add(x, y) {
    return x + y;
}
// using explicit typing
function add(x: number, y: number): number {
    return x + y;
}

總結(jié):我們建立了一個繼承自 TypedDict 的類,指定了每個項目的名稱和類型,並使用 Unpack 運算子告訴「mypy」接收到的物件是一個 TypedDict。

結(jié)果,我們的程式碼大小增加了一倍。如果我們的物件有更多的項目,它會變得更長。

幸運的是,我們可以對程式碼的某些部分使用靜態(tài)類型,而將其餘部分保留為動態(tài)類型?;蛘撸绻覀冾娨?,我們可以選擇根本不使用它。

The Irony of Static Typing in Dynamic Languages

我們什麼時候應(yīng)該使用它?

不要因為學(xué)到了一個新的、閃亮的功能而感到有重寫整個程式碼庫的壓力。

這些新功能就像工具。我的建議是明智地使用它們:

在下列場景中使用靜態(tài)型別:

  • 從外部來源(例如資料庫、庫和 API)檢索資料時。
  • 程式碼中不允許失敗的關(guān)鍵部分。
  • 當(dāng)您的程式碼庫容易出現(xiàn)頻繁錯誤時。

在下列情況下避免使用靜態(tài)型別:

  • 設(shè)計原型以快速測試您的想法。
  • 實作內(nèi)部邏輯,其中類型檢查只會導(dǎo)致冗長的程式碼,沒有任何好處。
  • 僅在螢?zāi)簧巷@示資料(例如繪製圖表、圖像、數(shù)字...)。
  • 編寫無需使用者輸入的命令列腳本。

請記住,在編碼方面,黃金法則始終是力求簡單,除非您有充分的理由使事情複雜化。

以上是動態(tài)語言中靜態(tài)型別的諷刺的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

我如何了解最新的PHP開發(fā)和最佳實踐? 我如何了解最新的PHP開發(fā)和最佳實踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時區(qū)? 如何設(shè)置PHP時區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

我如何驗證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? 我如何驗證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? Jun 22, 2025 am 01:00 AM

TovalidateuserinputinPHP,usebuilt-invalidationfunctionslikefilter_var()andfilter_input(),applyregularexpressionsforcustomformatssuchasusernamesorphonenumbers,checkdatatypesfornumericvalueslikeageorprice,setlengthlimitsandtrimwhitespacetopreventlayout

編寫清潔和可維護的PHP代碼的最佳實踐是什麼? 編寫清潔和可維護的PHP代碼的最佳實踐是什麼? Jun 24, 2025 am 12:53 AM

寫乾淨(jìng)、易維護的PHP代碼關(guān)鍵在於清晰命名、遵循標(biāo)準(zhǔn)、合理結(jié)構(gòu)、善用註釋和可測試性。 1.使用明確的變量、函數(shù)和類名,如$userData和calculateTotalPrice();2.遵循PSR-12標(biāo)準(zhǔn)統(tǒng)一代碼風(fēng)格;3.按職責(zé)拆分代碼結(jié)構(gòu),使用MVC或Laravel式目錄組織;4.避免麵條式代碼,將邏輯拆分為單一職責(zé)的小函數(shù);5.在關(guān)鍵處添加註釋並撰寫接口文檔,明確參數(shù)、返回值和異常;6.提高可測試性,採用依賴注入、減少全局狀態(tài)和靜態(tài)方法。這些做法提升代碼質(zhì)量、協(xié)作效率和後期維護便利性。

什麼是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? 什麼是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? Jun 22, 2025 am 01:03 AM

thephpfunctionserize()andunSerialize()redustoconvertComplexdatStructDestoresToroStoroStoroSandaBackagagain.1.Serialize()

如何將PHP代碼嵌入HTML文件中? 如何將PHP代碼嵌入HTML文件中? Jun 22, 2025 am 01:00 AM

可以將PHP代碼嵌入HTML文件中,但需確保文件以.php為擴展名,以便服務(wù)器能正確解析。使用標(biāo)準(zhǔn)的標(biāo)籤包裹PHP代碼,可在HTML中任意位置插入動態(tài)內(nèi)容。此外,可在同一文件中多次切換PHP與HTML,實現(xiàn)條件渲染等動態(tài)功能。務(wù)必注意服務(wù)器配置及語法正確性,避免因短標(biāo)籤、引號錯誤或遺漏結(jié)束標(biāo)籤導(dǎo)致問題。

如何使用PHP執(zhí)行SQL查詢? 如何使用PHP執(zhí)行SQL查詢? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

See all articles