static静态局部变量(不是数组)在函数中的使用特点

一、static静态局部变量(不是数组)在函数中的使用特点: 

    (1)静态局部变量不会随着函数的调用和退出而发生变化;不过,尽管该变量还继续存在,但确不能在函数外部直接使用它(获取不到值)。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值. 


   (2)静态局部变量只会初始化一次. 


   (3)静态局部变量只能被初始化为一个字符值或一个常量,不能使用表达式。即使静态局部变量定义时没有赋初值,系统会自动赋初值0.


   (4)当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量. 

 

   (5)static $var=5;  //【变量的赋值操作只会在变量第一次初始化时会被调用,在之后函数的执行过程中该操作不会被调用】 

 

   (6)静态变量是只存在于函数作用域的变量。不过,在函数执行完成后,这种变量的值不会丢失,也就是说,在下一次调用这个函数时,变量仍然会记得原来的值,要将某个变量定义为静态的,只需要在变量前加上static关键字即可: 

function test(){  
    static $var=5;  //static $var = 1+1;就会报错,不能使用表达式  
    $var++;  
    echo $var.'<br/>';  
}  
   
test(); //结果:6  
test(); //结果:7  
test(); //结果:8  
echo $var;//Notice:Undefined variable: var 即:不能在函数外部使用静态局部变量,获取不到值

二、类中的static静态属性和方法用什么作用? 

    (1)无论你实例化了多少个对象,static定义的属性和方法,都只有一个,只占有一次内存,节省了系统的内存开销 。

     

    (2)访问static属性和方法时,只能用::访问。 

 

    (3)静态成员是一种类变量,可以把它看成时属于整个类而不是属于类的某个实例。 与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的,也就是说,所有的实例共享这个成员。 

 

    (4)$this只表示类的当前实例,self::表示的是类本身,在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置。也就是说,在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。 

       与$this不同的是,在使用静态变量时,必须在作用域限定符后面加上$符号。如: 

$this->name;//调用非静态属性 
self::$name;//调用静态属性

 

    (5)扩展类中,在基类的方法被重写的情况下,使用 parent 作用域调用定义在基类中的方法。静态成员也可以只属于父类。如果在子类和父类中同时声明了某个成员,也可以使用parant::在子类中访问父类中的变量。在这种情况下,父类的静态成员和子类的静态成员保存的是不同的值。 

      

    (6)可以在::操作符的左边写上类的名称来静态地访问某个成员,这样避免创建类的实例。不仅可以省略掉实例化类的代码,而且还会更高效,因为类的每个实例都会占用一小部分的系统资源。 

     

    (7)案例: 

class visitors {

    private static $visitors = 0;

    function __construct() {
        self::$visitors++;
    }

    static function getVisitors() {
        return self::$visitors;
    }

}

$visits = new visitors();
echo visitors::getVisitors() . "<br />"; //结果:1 
$visits2 = new visitors();
echo visitors::getVisitors() . "<br />"; //结果:2

    因为$visitors字段声明为static,所以对其值的任何改变都会反映到所有实例化对象中。

    还要注意,静态字段和方法应使用self关键字和类名来引用,而不是通过this和箭头操作符。 

    这是因为使用“正常”方法引用静态字段是不可能的,会导致语法错误。 

    不能在类中使用$this来引用为static字段。 

 

    (8)静态方法: 

        静态方法和非静态方法之间有一个重要的区别:在调用静态方法时,不再需要拥有类的实例。 

        静态方法和非静态方法使用原则: 

            (1)、是如果某个方法中不包含$this变量,就应该时静态方法; 

            (2)、如果不需要类的实例,可能还应该使用静态类,这样可以免去实例化类的工作。  

            (3)、在静态方法中时不能使用$this变量的,因为静态方法不属于某个特定的实例。 


技苑
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • © 2016-2024 技苑 | PHP是最好的语言 版权所有 ICP证:鄂ICP备15021999号-4
  • 联系邮箱:master@pengxb.com