php中的靜態變數只存在於函數作用域內,也就是說,靜態變數只存活在堆疊中;在PHP只要在變數前面加上關鍵字static,變數就變成靜態變數了。
本文操作環境:Windows7系統、PHP7.1版、DELL G3電腦
php方法中的靜態變數是什麼?
PHP中的靜態變數及static靜態變數使用詳解
靜態變數只存在於函數作用域內,也就是說,靜態變數只存活在堆疊中。一般的函數內變數在函數結束後會釋放,例如局部變量,但是靜態變數卻不會。是說,下次再呼叫這個函數的時候,該變數的值會保留下來。
#只要在變數前面加上關鍵字static,變數就變成靜態變數了。
<?php function test() { static $nm = ; $nm = $nm * ; print $nm."<br />"; } // 第一次执行,$nm = test(); // 第一次执行,$nm = test(); // 第一次执行,$nm = test(); ?>
程式運行結果:
1
2
2
4
3
8
函數test( )執行後,變數$nm的值都保存了下來。
在class中常使用到靜態屬性,例如靜態成員、靜態方法。
Program List:類別的靜態成員
靜態變數$nm屬於類別nowamagic,而不是類別的某個實例。這個變數對所有實例都有效。
::是作用域限定運算符,這裡用的是self作用域,而不是$this作用域,$this作用域只表示類別的目前實例,self::表示的是類別本身。
<?php class nowamagic { public static $nm = ; function nmMethod() { self::$nm += ; echo self::$nm . '<br />'; } } $nmInstance = new nowamagic(); $nmInstance -> nmMethod(); $nmInstance = new nowamagic(); $nmInstance -> nmMethod(); ?>
程式執行結果:
1
3
2
5
Program List:靜態屬性
<?php class NowaMagic { public static $nm = 'www.nowamagic.net'; public function nmMethod() { return self::$nm; } } class Article extends NowaMagic { public function articleMethod() { return parent::$nm; } } // 通过作用于限定操作符访问静态变量 print NowaMagic::$nm . "<br />"; // 调用类的方法 $nowamagic = new NowaMagic(); print $nowamagic->nmMethod() . "<br />"; print Article::$nm . "<br />"; $nmArticle = new Article(); print $nmArticle->nmMethod() . "<br />"; ?>
程式運行結果:
www.nowamagic.net
www.nowamagic.net
www.nowamagic.net
www.nowamagic.net
Program List:簡單的靜態建構器
PHP沒有靜態建構器,你可能需要初始化靜態類,有一個很簡單的方法,在類別定義後面直接呼叫類別的Demonstration()方法。
<?php function Demonstration() { return 'This is the result of demonstration()'; } class MyStaticClass { //public static $MyStaticVar = Demonstration(); //!!! FAILS: syntax error public static $MyStaticVar = null; public static function MyStaticInit() { //this is the static constructor //because in a function, everything is allowed, including initializing using other functions self::$MyStaticVar = Demonstration(); } } MyStaticClass::MyStaticInit(); //Call the static constructor echo MyStaticClass::$MyStaticVar; //This is the result of demonstration() ?>
程式運行結果:
This is the result of demonstration()
下面要介紹PHP靜態變數static的使用介紹
static關鍵字在C#程式設計中非常常見,它用來修飾符宣告屬於類型本身而不是屬於特定物件的靜態成員。 static 修飾符可用於類別、欄位、方法、屬性、運算子、事件和建構函數,但不能用於索引器、析構函數或類別以外的類型。宣告為static的類別、函數和變數將不能引用實例方法或變量,另外在C#中一旦類別被添加了static修飾符,則其內部所有變數和方法都必須是靜態的。靜態變數和方法必須透過類別名稱進行引用而不能透過實例物件引用。
那麼static關鍵字在php中與C#都有些不同呢?
聲明範圍
相對C#來說,PHP中static變數的使用範圍要更廣一些,我們不僅可以在類,方法或變數前面加上static修飾符,甚至還能為函數內部變數新增static關鍵字。新增了static修飾符的變數即使在該函數執行完畢值仍然不會遺失,也就是說,在下次呼叫這個函數時,變數仍然記得原來的值。如:
<?php function test() { static $var=; $var+=; echo $var.' '; } test(); test(); test(); ?>
運行結果如下:
3 5 7
這裡有一點要注意的是,變數的賦值運算只會在變數第一次初始化時會被調用,在之後函數的執行過程中,這個操作不會被調用。
由於PHP中函數同樣是一等公民,所以不同於C#,我們可以直接定義函數,並直接在程式碼的任何地方調用,這一點跟javascript倒是有些相似。因此這時候函數靜態變數會比定義全域變數更有用,它可以避免變數重複定義導致衝突。而由於C#中函數無法直接定義和調用,它必須寄宿在類別中,所以如果函數需要靜態變量,我們只需要在類別中定義便能達到相同效果。
呼叫方式
C#中,我們呼叫靜態成員的方式非常簡單和一致,因為靜態成員不屬於實例對象,所以無論是方法還是變量,C#對其靜態成員的存取方式一律是透過類別名稱.方法(變數)進行。且在C#中,靜態函數是不能被設定為虛方法或覆蓋的。而PHP對此提供了更為靈活多樣的支援。
首先,我們知道PHP中調用實例方法都是透過如:someobj->someFun()調用,那麼我們調用靜態函數是否也能像C#那樣透過SomeClass->someFun()調用呢?答案是否定的,在PHP中,對靜態成員的呼叫只能透過::的方式進行,如:SomeClass::someFun()。
<?php class TestC { public static $var=; public $var=; function t() { self::$var+=; echo self::$var.' '; echo $this->var.' '; } public static function t() { self::$var+=; echo self::$var.' '; } } $t=new TestC(); $t->t(); TestC::t(); ?>
運行結果如下:
3 1 5
#另外一點和C#中不同的是,在類別中的方法中,如果我們需要呼叫靜態變量,必須透過self::$somVar靜態變數(注意變數前面的$符號,實例變數不需要),而呼叫靜態方法則為self::someFun()(這裡不需要$符號)。如上例。
另外,与C#最大的不同之处就是,PHP中,子类是可以覆盖父类的静态函数或变量的,不仅如此,(站在C#程序员的角度来看,我觉得PHP这点反而将事情搞复杂了),由于默认self::staticFun()调用的是子类的静态函数,这个时候如果我们想调用父类的静态变量怎么办呢?这里PHP提供了额外的parent来调用基类的静态成员。如:
<?php class TestC { public static $var=; public $var=; function t() { self::$var+=; echo self::$var.' '; echo $this->var.' '; } public static function t() { self::$var+=; echo self::$var.' '; } } $t=new TestC(); $t->t(); TestC::t(); ?>
运行结果如下:
3 5 ‘Hello'
最好,根据上面的例子我们很容易想到,子类访问父类可以使用parent关键字,那么父类如何访问子类的静态方法呢?这里给出static的另外一个用法,这里如果将调用的静态方法前面的作用域换成static的话,PHP会根据该类的继承层次来计算最终的静态方法。如:
<?php class Test { function t() { static::t(); } public static function t() { echo self::'Test '; } } class Test extends Test { static function t() { echo self::'Test '; } } $t=new Test(); $t->t(); Test::t(); ?>
运行结果如下:
Test2 Test2
这里t实例在t1方法调用t2静态方法时,会根据其实例找到最终的静态方法并输出Test2。
总结
从上面的分析,我们不难看出,对于静态成员的使用,PHP提供了比C#更为强大的功能或灵活性,但从我的角度来看,这种灵活性不见得就更好,从某种角度来看,如果类的继承层次过于复杂,它可能会让我产生混淆。当然,同样的工具不同人使用效果会完全不一样,既然PHP提供了更多样的选择,那么相信如果使用恰当的话,PHP中的static可能会提供比C#中更为强大而简便的使用方式。
推荐学习:《PHP视频教程》
以上是php方法中的靜態變數是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Dreamweaver CS6
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。