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

首頁 后端開發(fā) php教程 動(dòng)態(tài)語言中靜態(tài)類型的諷刺

動(dòng)態(tài)語言中靜態(tài)類型的諷刺

Nov 03, 2024 am 06:28 AM

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

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

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

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

  • Python:自 2015 年版本 3.5 開始引入類型提示功能,并在 2022 年版本 3.12 中得到增強(qiáng)。
  • PHP:2015 年版本 7 中引入的聲明類型。
  • JavaScript:通過 2012 年 TypeScript 的發(fā)布進(jìn)行了擴(kuò)展,定義為“具有類型語法的 JavaScript”。

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

在嚴(yán)格類型語言中,我們在代碼中顯式定義變量的類型。目標(biāo)是在執(zhí)行程序之前捕獲開發(fā)階段的錯(cuò)誤,并向編譯器提供有關(guān)分配給這些變量的內(nèi)存大小的提示。

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

另一方面,動(dòng)態(tài)類型語言(例如 Python、PHP 和 JavaScript)允許我們創(chuàng)建變量并讓解釋器在運(yùn)行時(shí)暗示它們的類型:

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

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

在下面的示例中,我們使用動(dòng)態(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 作為獨(dú)立類型的支持來進(jìn)一步推動(dòng)它:

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

諷刺在哪里?

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

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

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

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

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

declare(strict_types=1);

在 python 中,您可以使用“mypy”包來分析代碼并捕獲錯(cuò)誤:

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

您可以看到“mypy”作為顧問,告訴您做錯(cuò)了什么,但這并不能阻止您執(zhí)行代碼,風(fēng)險(xiǎn)由您承擔(dān)。

The Irony of Static Typing in Dynamic Languages

即使您不確定變量的類型,您仍然可以使用聯(lián)合運(yùn)算符來減少接受類型的列表:

以下來自 PHP 和 Python 的示例展示了如何做到這一點(diǎn):

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

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

十年前,我決定使用 Python 攻讀博士學(xué)位,因?yàn)樗唵吻夷軌蚩焖贅?gòu)建新想法原型。然后我也開始將它用于我的其他項(xiàng)目。

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

讓我們看一個(gè)打印字典項(xiàng)目的示例函數(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 的建議,代碼變?yōu)椋?br>

// 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é):我們創(chuàng)建了一個(gè)繼承自 TypedDict 的類,指定了每個(gè)項(xiàng)目的名稱和類型,并使用 Unpack 運(yùn)算符告訴“mypy”接收到的對象是一個(gè) TypedDict。

結(jié)果,我們的代碼大小增加了一倍。如果我們的對象有更多的項(xiàng)目,它會變得更長。

幸運(yùn)的是,我們可以對代碼的某些部分使用靜態(tài)類型,而將其余部分保留為動(dòng)態(tài)類型。或者,如果我們愿意,我們可以選擇根本不使用它。

The Irony of Static Typing in Dynamic Languages

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

不要因?yàn)閷W(xué)到了一個(gè)新的、閃亮的功能而感到有重寫整個(gè)代碼庫的壓力。

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

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

  • 從外部源(例如數(shù)據(jù)庫、庫和 API)檢索數(shù)據(jù)時(shí)。
  • 代碼中不允許失敗的關(guān)鍵部分。
  • 當(dāng)您的代碼庫容易出現(xiàn)頻繁錯(cuò)誤時(shí)。

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

  • 設(shè)計(jì)原型以快速測試您的想法。
  • 實(shí)現(xiàn)內(nèi)部邏輯,其中類型檢查只會導(dǎo)致冗長的代碼,沒有任何好處。
  • 僅在屏幕上顯示數(shù)據(jù)(例如繪制圖表、圖像、數(shù)字......)。
  • 編寫無需用戶輸入的命令行腳本。

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

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

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 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時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

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

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

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

編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什么? 編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什么? Jun 24, 2025 am 12:53 AM

寫干凈、易維護(hù)的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é)作效率和后期維護(hù)便利性。

什么是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為擴(kuò)展名,以便服務(wù)器能正確解析。使用標(biāo)準(zhǔn)的標(biāo)簽包裹PHP代碼,可在HTML中任意位置插入動(dòng)態(tài)內(nèi)容。此外,可在同一文件中多次切換PHP與HTML,實(shí)現(xiàn)條件渲染等動(dòng)態(tài)功能。務(wù)必注意服務(wù)器配置及語法正確性,避免因短標(biāo)簽、引號錯(cuò)誤或遺漏結(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