目錄
回复内容:
首頁 後端開發 php教程 弱类型语言比强类型语言的优势、劣势、分别是什么?能用两种语言如 PHP 和 C# 举例论证吗?

弱类型语言比强类型语言的优势、劣势、分别是什么?能用两种语言如 PHP 和 C# 举例论证吗?

Jun 17, 2016 am 08:31 AM

回复内容:

写JavaScript之前听人说不用理会变量的类型,直接用就好。然后各种进坑。。
明明是区分的好吧,只是语言上不明显表示出来,另外附带一些不太智能的类型自动转换。
弱类型语言确实比较好入门,但要想精通还是不能忽略变量类型的。
另外,问题如果能在运行时外解决,干嘛要带进去呢。 最近javascript写得多深有体会。本来我就知道弱类型语言就是很容易写出翔,于是我牺牲了一点性能到处assert,加载一个页面assert了两千多次,证明效果还是很不错的。然而,浏览器并不会像Visual Studio一样,可以在任何情况下都非常直接的告诉我,到底哪个assert中了。更可恶的是,像C++/C#这样的语言,exception被catch的时候是会保留throw的那一刻的debug信息的,javascript直接就先unwind stack了再catch,还得苦逼的展开error对象的内容,人肉看stack information,自己跳过去,然而此刻本地变量早就丢了……

特别怀念写ASP.NET的时候,可以用Visual Studio来调试浏览器里的代码的日子。

php估计也差不多。 弱类型不严谨,在对类型要求比较严格的情况下就需要注意异常情况:比如接收参数时需要判断是int型,但是php收到的全部都可以当成字符串,要自己用intval之类的函数转换;有时候判断需要“===”才能保证不出问题。c#是不用担心这些的,类型不匹配在写代码的时候就报错了。

弱类型的优势有一个很好的例子就是操作json,php用json_decode函数一下就变成了一个数组,数组在php中是万能结构,想怎么用就怎么用。c#解json就有点复杂了,每一个值都要转换成对应类型,就是说你解析之前就要明白里面是什么结构,每个值是什么类型。 我猜题主其实想问的是动态类型语言和静态类型语言 在“严谨”的语言中,通常是预先定义好一个值的类型,自始至终,变量的类型是固定的。

对比起强类型,弱类型的缺点大概如下:
(1)弱类型不符合“所见即所得”,定义的变量类型是不可预见并且可以改变的。
(2)为了兼容弱类型,语言执行引擎要做了大量的兼容工作,包括类型识别,内存管理,类型转换等,增加了语言内部处理的复杂度,会导致执行效率的降低。
(3)变量的类型是不可控的,因此执行过程中拥有大量的变量类型“隐形转换”,在开发同学不清楚隐性转换规则的情况下,容易产生不可预知的结果。这个特性也完全不符合所见即所得的简单性。

但是,它们之所以可以发展起来,脱颖而出,也是有原因的,存在就有它的道理。
弱类型等语言特性,降低了程序员编写语言的门槛。编程言语是人类和机器沟通的桥梁,终极追求其实是“降低人和机器的沟通成本”,追求“人人皆可编程”的境界。
例如,从机器语言的0和1开始,后来变成汇编语言,汇编语言发展出来C,后来再有现在的脚本语言。编程学习的门槛不断降低,程序员的数量也随着指数增长。
而且,我相信未来还会继续发展出更低学习门槛的语言,促进程序员数量的再一次指数增长。

弱类型的语言也有优点:
(1)屏蔽了语言的复杂性和容易导致错误的地方,例如:内存管理、指针、变量的类型等。虽然,它屏蔽了比较复杂的特性,但是,并不代表它们不存在,这样的做法是对人友好(编程更简单,考虑的东西更少),但是对机器不友好。
(2)项目开发效率高。
(3)学习门槛低。
它虽然带有不少的问题,但是,也包含了很明显的优点。
PHP比较大范围地用于Web开发,Javascript统治浏览器端的开发,这些都不是偶然现象,而是人用脚投票选择出来的。

当然,术业有专攻,不同的语言解决不同场景的问题,不能一概而论。 比如fastCSharp,无论是开发效率还是运行效率,随时欢迎各位PHPer挑战。
弱类型语言有两个优势:一是eval,其实我真的不知道这算不算优势;二是有弱类型需求的情况下,代码相对于强类型语言更优雅(一行少敲几下键盘)。
弱类型语言的劣势太多太多,可以说满身都是,只是很多人不愿意承认而已。 弱类型比较重要的好处主要在于给另一些语言特性的实现带来的便利性。比如闭包和回调函数。PHP我不懂,不过javascript大量依赖的回调函数和衍生出来的error first callback pattern等东西,在强类型语言里会不好实现。当然也有别的非弱类型实现,比如Ruby会用argument as hash之类的手段来回避函数签名不一致之类的问题。

之前很多人提到理想中的语言应该有optional static typing。其实放到strong/weak typing上或者也是一样,最理想的是optional weak typing。只是我认为除非必要,否则不在编译期检查类型,所以应该是dynamic typing为缺省,显式的声明static typing。而强弱这边则应该是缺省强类型,显式声明弱类型(即明确表示内容convertible)。

不过目前看来还没有人整这样一门语言,XD,现有的凑合着用吧。 PHP的优势在于
PHP 是最好的语言
好吧,我再说一遍等于我也有责任。

PHP是弱类型语言,容易出现什么问题呢?举个栗子。
<span class="cp"><?php</span>
<span class="cm">/*</span>
<span class="cm">strpos(string, find)</span>
<span class="cm">返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。</span>
<span class="cm">*/</span>

<span class="nv">$string</span> <span class="o">=</span> <span class="s1">'zhihu'</span><span class="p">;</span>

<span class="nv">$find</span> <span class="o">=</span> <span class="s1">'h'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$string</span><span class="p">,</span> <span class="nv">$find</span><span class="p">)</span> <span class="o">==</span> <span class="k">false</span><span class="p">)</span>
	<span class="k">echo</span> <span class="s1">'not found'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$string</span><span class="p">,</span> <span class="nv">$find</span><span class="p">))</span>
	<span class="k">echo</span> <span class="s1">'not found'</span><span class="p">;</span>

<span class="nv">$find</span> <span class="o">=</span> <span class="s1">'z'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$string</span><span class="p">,</span> <span class="nv">$find</span><span class="p">)</span> <span class="o">==</span> <span class="k">false</span><span class="p">)</span>
	<span class="k">echo</span> <span class="s1">'not found'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">strpos</span><span class="p">(</span><span class="nv">$string</span><span class="p">,</span> <span class="nv">$find</span><span class="p">))</span>
	<span class="k">echo</span> <span class="s1">'not found'</span><span class="p">;</span>
<span class="cp">?></span><span class="x"></span>
登入後複製
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試? 在PHPStorm中如何進行CLI模式的調試? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

See all articles