程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php中static關鍵字對變量和函數影響

php中static關鍵字對變量和函數影響

編輯:關於PHP編程

在php中static是一個靜態變量,他可以定義函數,變量為全局靜態變量了,那麼我們在函數或變量前面加上static會對函數與變量產生怎麼樣的影響呢,下面我們一起來看看。

 
1) 全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上並無不同。這兩者的區別在於非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域局限於一個源文件內,只能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。

2) 從以上分析可以看出, 把局部變量改變為靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量後是改變了它的作用域,限制了它的使用范圍。  

3) static函數與普通函數作用域不同,僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件


PHP5.3.0之後,我們可以用一個變量來動態調用類。但該變量的值不能為關鍵字self, parent 或static。

Example #1 靜態成員代碼示例

 代碼如下 復制代碼


<?php
class 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_static

print $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 靜態方法代碼示例

<?php
class 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

function dewen(){
  $k=add_number(100);
  $k+=add_number(100);
  printf("%d",$k);
  return 0;
 }

 function add_number($n){
  static $i=100;
  $i+=$n;
  return $i;
 }

第一眼以為就是簡單地自加計算:以為結果是400,結果答案錯誤。最後仔細看了下,敲了一邊代碼,運行才知道是500。打印了兩次$i+=$n;計算之前的$i,一次是100,一次是200;知道問題是static在做鬼。然後百度了一下static關鍵字,才恍然大悟。

static關鍵字作用:

PHP中static變量的使用范圍要更廣一些,我們不僅可以在類,方法或變量前面添加 static修飾符,我們甚至還能給函數內部變量添加static關鍵字。添加了static修飾符的變量即使在該函數執行完畢值仍然不會丟失,也就是說,在下一次調用這個函數時,變量仍然記得原來的值。如:

 代碼如下 復制代碼

01  <?php 

02  function test() 

03  { 

04       static $var1 =1; 

05       $var1 +=2; 

06       echo $var1 . ' ' ; 

07  } 

08   

09  test(); 

10  test(); 

11  test(); 

12  ?> 
運行結果如下:

3 5 7

綜上所述:

static全局變量與普通的全局變量有什麼區別:
static全局變量只初使化一次,防止在其他文件單元中被引用;   
static局部變量和普通局部變量有什麼區別:
static局部變量只被初始化一次,下一次依據上一次結果值;   
static函數與普通函數有什麼區別:
static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved