目錄
声明范围。
调用方式
生命周期
总结
首頁 php教程 php手册 .NET程序员学PHP:static关键字

.NET程序员学PHP:static关键字

Jun 06, 2016 pm 07:40 PM
.net php static 關鍵字 學習 程式設計師

学习PHP也有一段时间了,有些东西觉得还是需要总结一些,对于.NET 程序员 来说,PHP中有很多概念都跟以前的理解不一样,这里我们将重点分析下 static 关键字 。 static 关键字 在C#编程中非常常见,它用来修饰符声明属于类型本身而不是属于特定对象的静态成

学习PHP也有一段时间了,有些东西觉得还是需要总结一些,对于.NET程序员来说,PHP中有很多概念都跟以前的理解不一样,这里我们将重点分析下static关键字

static关键字在C#编程中非常常见,它用来修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。声明为static的类、函数和变量将不能引用实例方法或变量,另外在C#中一旦类被添加了static修饰符,则其内部所有变量和方法都必须是静态的。静态变量和方法必须通过类名进行引用而不能通过实例对象引用。

那么static关键字在php中与C#中都有些什么不同呢?

声明范围。

相对C#来说,PHP中static变量的使用范围要更广一些,我们不仅可以在类,方法或变量前面添加static修饰符,我们甚至还能给函数内部变量添加static关键字。添加了static修饰符的变量即使在该函数执行完毕值仍然不会丢失,也就是说,在下一次调用这个函数时,变量仍然记得原来的值。如:

<p><span></span><span>php<br></span><span>function</span><span> test(){<br>    </span><span>static</span><span>$var1</span><span>=</span><span>1</span><span>;<br>    </span><span>$var1</span><span>+=</span><span>2</span><span>;<br>    </span><span>echo</span><span>$var1</span><span>.</span><span>'</span><span>&nbsp</span><span>'</span><span>;<br>}<br>test();<br>test();<br>test();<br></span><span>?></span></p>
登入後複製

代码会输出:3 5 7

这里有一点需要注意的是,变量的赋值操作只会在变量第一次初始化时会被调用,在之后函数的执行过程中,这个操作不会被调用。

由于PHP中函数同样是一等公民,所以不同于C#,我们可以直接定义函数,并直接在代码的任何地方调用,这一点跟javascript倒是有些相似。因此这时候函数静态变量会比定义全局变量更加有用,它可以避免变量重复定义导致冲突。而由于C#中函数无法直接定义和调用,它必须寄宿在类中,所以如果函数需要静态变量,我们只需要在类中定义便能达到相同效果。

调用方式

C#中,我们调用静态成员的方式非常简单和一致,因为静态成员不属于实例对象,所以无论是方法还是变量,C#对其静态成员的访问方式一律是通过类名.方法(变量)进行。并且在C#中,静态函数是不能被设置为虚方法或者覆盖的。而PHP对此则提供了更为灵活多样的支持。

首先,我们知道PHP中调用实例方法都是通过如:someobj->someFun()调用,那么我们调用静态函数是否也能像C#那样通过SomeClass->someFun()调用呢?答案是否定的,在PHP中,对静态成员的调用只能通过::的方式进行,如:SomeClass::someFun()。

.NET程序员学PHP:static关键字.NET程序员学PHP:static关键字代码

<p><span></span><span>php<br></span><span>class</span><span> TestC{<br>    </span><span>public</span><span>static</span><span>$var1</span><span>=</span><span>1</span><span>;<br>    </span><span>public</span><span>$var2</span><span>=</span><span>1</span><span>;<br>    </span><span>function</span><span> t1(){<br>        self</span><span>::</span><span>$var1</span><span>+=</span><span>2</span><span>;<br>        </span><span>echo</span><span> self</span><span>::</span><span>$var1</span><span>.</span><span>'</span><span>&nbsp</span><span>'</span><span>;<br>        </span><span>echo</span><span>$this</span><span>-></span><span>var2</span><span>.</span><span>'</span><span>&nbsp</span><span>'</span><span>;<br>    }<br>    </span><span>public</span><span>static</span><span>function</span><span> t2(){<br>        self</span><span>::</span><span>$var1</span><span>+=</span><span>2</span><span>;<br>        </span><span>echo</span><span> self</span><span>::</span><span>$var1</span><span>.</span><span>'</span><span>&nbsp</span><span>'</span><span>;<br>    }<br>}<br></span><span>$t</span><span>=</span><span>new</span><span> TestC();<br></span><span>$t</span><span>-></span><span>t1();<br>TestC</span><span>::</span><span>t2(); </span></p>
登入後複製

结果输出为:3 1 5

另外一点和C#中不同的是,在类中的方法中,如果我们需要调用静态变量,必须通过self::$somVar静态变量(注意变量前面的$符号,实例变量不需要),而调用静态方法则为self::someFun()(这里不需要$符号)。如上例。

另外,与C#最大的不同之处就是,PHP中,子类是可以覆盖父类的静态函数或变量的,不仅如此,(站在C#程序员的角度来看,我觉得PHP这点反而将事情搞复杂了),由于默认self::staticFun()调用的是子类的静态函数,这个时候如果我们想调用父类的静态变量怎么办呢?这里PHP提供了额外的parent来调用基类的静态成员。如:

.NET程序员学PHP:static关键字.NET程序员学PHP:static关键字代码

<p><span></span><span>php<br></span><span>class</span><span> Test1{<br>    </span><span>public</span><span>static</span><span>$var1</span><span>=</span><span>1</span><span>;<br>    </span><span>public</span><span>static</span><span>function</span><span> t2(){<br>        self</span><span>::</span><span>$var1</span><span>+=</span><span>2</span><span>;<br>        </span><span>echo</span><span> self</span><span>::</span><span>$var1</span><span>.</span><span>'</span><span>&nbsp</span><span>'</span><span>;<br>    }<br>}<br></span><span>class</span><span> Test2 </span><span>extends</span><span> Test1{<br>    </span><span>static</span><span>$var1</span><span>=</span><span>‘Hello’;<br>    </span><span>static</span><span>function</span><span> t2(){<br>        parent</span><span>::</span><span>t2();<br>        </span><span>echo</span><span> self</span><span>::</span><span>$var1</span><span>.</span><span>'</span><span>&nbsp</span><span>'</span><span>;<br>    }<br>}<br>Test1</span><span>::</span><span>t2();<br>Test2</span><span>::</span><span>t2();<br></span><span>?></span></p>
登入後複製

结果输出为:3 5 Hello

最好,根据上面的例子我们很容易想到,子类访问父类可以使用parent关键字,那么父类如何访问子类的静态方法呢?这里给出static的另外一个用法,这里如果将调用的静态方法前面的作用域换成static的话,PHP会根据该类的继承层次来计算最终的静态方法。如:

.NET程序员学PHP:static关键字.NET程序员学PHP:static关键字代码

<p><span></span><span>php<br></span><span>class</span><span> Test1{<br>    </span><span>function</span><span> t1(){<br>        </span><span>static</span><span>::</span><span>t2();<br>    }<br>    </span><span>public</span><span>static</span><span>function</span><span> t2(){<br>        </span><span>echo</span><span> self</span><span>::</span><span>'</span><span>Test1&nbsp</span><span>'</span><span>;<br>    }<br>}<br></span><span>class</span><span> Test2 </span><span>extends</span><span> Test1{<br>    </span><span>static</span><span>function</span><span> t2(){<br>        </span><span>echo</span><span> self</span><span>::</span><span>'</span><span>Test2&nbsp</span><span>'</span><span>;<br>    }<br>}<br></span><span>$t</span><span>=</span><span>new</span><span> Test2();<br></span><span>$t</span><span>-></span><span>t1();<br>Test2</span><span>::</span><span>t2();<br></span><span>?></span></p>
登入後複製

结果输出为:Test2 Test2。

这里t实例在t1方法调用t2静态方法时,会根据其实例找到最终的静态方法并输出Test2。

生命周期

由于.NET和PHP本质的不同,所以static在两种语言中运行时会有明显的不同,在.NET中,static是伴随程序生命周期而存在的,也就是说任何.NET程序,不管是ASP.NET Web程序还是普通的WinForm程序,只要程序启动之后,static的值就会被一直保留,比如我们访问一个Web站点时,如果里面有个int的访问计数的静态变量表示访问人数,只要IIS和该进程没有停止,静态变量值就不会被重置。但在PHP中,static值仅在用户的一次访问过程中存在,也就是说,static的生命周期为从用户发送请求到服务器端返回最终视图结果的整个过程,在这之后,所有的静态变量都会被服务器释放掉,直到下次用户发送新的请求重新初始化。

总结

从上面的分析,我们不难看出,对于静态成员的使用,PHP提供了比C#更为强大的功能或灵活性,但从我的角度来看,这种灵活性不见得就更好,从某种角度来看,如果类的继承层次过于复杂,它可能会让我产生混淆。当然,同样的工具不同人使用效果会完全不一样,既然PHP提供了更多样的选择,那么相信如果使用恰当的话,PHP中的static可能会提供比C#中更为强大而简便的使用方式。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

在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程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

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

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

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles