在php中static是一個靜態變數,他可以定義函數,變數為全域靜態變數了,那麼我們在函數或變數前面加上static會對函數與變數產生怎麼樣的影響呢,下面我們一起來看看。
1) 全域變數(外部變數)的說明之前再冠以static 就構成了靜態全域變數。全域變數本身就是靜態儲存方式, 靜態全域變數當然也是靜態儲存方式。 這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域變數的範圍是整個來源程式, 當一個來源程式由多個源檔案組成時,非靜態全域變數在各個源檔案中都是有效。 而靜態全域變數則限制了其範圍, 即只在定義該變數的源檔案內有效, 在同一來源程式的其它源檔案中不能使用它。由於靜態全域變數的範圍局限於一個源檔案內,只能為該源檔案內的函數公用,因此可以避免在其它源檔案中引起錯誤。
2) 從以上分析可以看出, 把局部變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域變數改變為靜態變數後是改變了它的範圍,限制了它的使用範圍。
3) static函數與普通函數範圍不同,僅在本檔案。只在當前源檔案中使用的函數應該說明為內建函式(static),內建函式應該在當前源檔案中說明和定義。對於可在當前源檔案以外使用的函數,應該在一個標頭檔中說明,要使用這些函數的源檔案要包含這個標頭檔
PHP5.3.0之後,我們可以用一個變數來動態調用類。但該變數的值不能為關鍵字self, parent 或static。
Example #1 靜態成員程式碼範例
<?phpclass Foo{ public static $my_static = 'foo'; public function staticValue() { return self::$my_static; }}class Bar extends Foo{ public function fooStatic() { return parent::$my_static; }}print Foo::$my_static . " ";$foo = new Foo();print $foo->staticValue() . " ";print $foo->my_static . " "; // Undefined "Property" my_staticprint $foo::$my_static . " ";$classname = 'Foo';print $classname::$my_static . " "; // PHP 5.3.0之後可以動態調用print Bar::$my_static . " ";$bar = new Bar();print $bar->fooStatic() . " ";?>
Example #2 靜態方法程式碼範例
<?phpclass Foo { public static function aStaticMethod() { // ... }}Foo::aStaticMethod();$classname = 'Foo';$classname::aStaticMethod(); // As of PHP 5.3.0?>
關於Static關鍵字在類中的使用,PHP手冊給出了如下的約定:
1、聲明類成員或方法為static,就可以不執行個體化類而直接存取。不能通過一個對象來訪問其中的靜態成員(靜態方法除外)。
2、由於靜態方法不需要通過對象即可調用,所以偽變數$this在靜態方法中不可用。
3、靜態屬性不可以由對象通過->操作符來訪問。
4、用::方式調用一個非靜態方法會導致一個E_STRICT層級的錯誤。
現在來關注一下第4條約定。
運行環境: (Win32) PHP/5.3.3
class Foo{ public static $my_static = 'foo';//聲明一個靜態成員 public function staticValue() {//靜態方法 return self::$my_static;// } public function run(){//非靜態方法 return "abc <br>"; } public function callrun() { return self::run();//用self::方式調用一個非靜態方法 } } echo Foo::$my_static . "<br >"; echo Foo::run();//用className::方法名調用非靜態方法 echo Foo::callrun();
static關鍵字作用:
PHP中static變數的使用範圍要更廣一些,我們不僅可以在類,方法或變數前面添加 static修飾符,我們甚至還能給函數內部變數添加static關鍵字。添加了static修飾符的變數即使在該函數執行完畢值仍然不會丟失,也就是說,在下一次調用這個函數時,變數仍然記得原來的值。