静态变量成员和方法
Posted Just do it
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态变量成员和方法相关的知识,希望对你有一定的参考价值。
静态变量
静态变量是只存在于函数作用域的变量,不过,在函数执行完成以后,这种变量的值不会丢失,也就是说,在下一次调用这个函数时,变量仍然会记得原来的值.
要将某个变量定义为静态的,只需要在变量前面加上static关键字即可.
function test(){ static $a = 1; $a *= 2; echo $a.\'<br/>\'; } test(); test(); test(); //结果 2 4 8
值得注意的是,变量的初始默认值为1,而这一赋值操作只会在变量第一次被初始化时发生.函数每次执行的过程中,这一操作不会被调用.
类中静态元素的使用
静态成员
静态成员是一种类变量,可以把它看成是属于整个类而不是属于类的某个实例.与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的,也就是说,所有的实例共享这个成员.
class MyObject{ public static $myStaticVar = 0; function myfunc(){ self::$myStaticVar += 2; echo self::$myStaticVar .\'<br/>\'; } } $instance1 = new MyObject(); $instance1->myfunc(); $instance2 = new MyObject(); $instance2->myfunc(); //结果 2 4
双冒号
作用域限定操作符,是用一个双冒号(::)来表示的,它被用来指定类中不同的作用域级别.这个操作符的左边表示的是作用域,右边表示的访问的成员.
通过作用域限定操作符,我们可以使用两个系统定义的作用域:self和parent.此外,php6还提供了static作用域.
使用self作用域访问父类中的函数:
class MyObject{ static function myBaseFunc(){ echo "I am declared in MyObject<br/>"; } } class MyExtendObject extends MyObject{ static function myExtendFunc(){ echo "myExtendFunc is declared in MyExtendObject<br/>"; self::myBaseFunc(); } } MyExtendObject::myExtendFunc(); //结果 //myExtendFunc is declared in MyExtendObject //I am declared in MyObject
在基类的方法被重写的情况下,调用定义的基类中的方法:
class MyObject{ function myMethod(){ //标准功能 echo "Standard Function<br/>"; } } class MyExtendObject extends MyObject{ function myMethod(){ //添加一些新 echo "New Function<br/>"; parent::myMethod(); } } $obj = new MyExtendObject(); $obj->myMethod(); //结果 //New Function //Standard Function
子类重写静态变量
class MyObject{ public static $myStaticVar = 0; static function myMethod(){ self::$myStaticVar +=2; echo self::$myStaticVar."<br/>"; } } class MyExtendObject extends MyObject{ //重写了myStaticVar public static $myStaticVar = 0; function myExtendMethod(){ echo parent::$myStaticVar."<br/>"; echo self::$myStaticVar."<br/>"; } } $instance1 = new MyObject(); $instance1->myMethod(); MyObject::myMethod(); //调用的非静态成员函数会有警告 MyExtendObject::myExtendMethod(); /* 2 4 Strict Standards: Non-static method MyExtendObject::myExtendMethod() should not be called statically in C:\\phpStudy\\wwwroot\\test\\test.php on line 23 4 0 */
在使用::操作符访问myVariable变量时,需要再次注意对$符号的使用.这是因为PHP当前不支持动态的静态变量的使用,也就是说不支持可变的静态变量.在使用$this->$variable时,被访问的成员是包含在$variable中的变量值.而不用$符号访问某个变量实际上查找的是类的某个常量,而常量是不能通过$this来访问的.
静态方法
静态方法的规则和静态变量是相同的.使用static关键字可以将方法标记为静态方法,而通过类的名称和作用域操作符(::)可以访问静态方法.
静态方法和非静态方法之间有一个很重要的区别:在调用静态方法时,我们不再需要拥有类的实例.
调用静态方法:
class MyObject{ static function myMethod(){ //执行一些操作 } } MyObject::myMethod();
PHP6中的static作用域
class MyObject{ static function myMethod(){ static::myOtherMethod(); } static function myOtherMethod(){ echo "Called from MyObject"; } } class MyExtendObject extends MyObject{ static function myOtherMethod(){ echo \'Called from MyExtendObject\'; } } MyExtendObject::myMethod(); //结果 //Called from MyExtendObject
上述代码会正确地调用MyExtendObject中的myOtherMethod方法.在PHP6之前的版本中,从父类中调用位于子类中的方法是不可能的,并且self::总是会调用MyObject中的方法.
静态方法和非静态方法选择原则
如果某个方法中不包括$this变量,那么这个方法就应该是静态方法.如果不需要类的实例,可能还应该使用静态类,这样就可以免去实例化类的工作.另外,在静态方法中是不能使用$this变量的,因为静态方法不属于某个特定的实例.
以上是关于静态变量成员和方法的主要内容,如果未能解决你的问题,请参考以下文章
区分成员变量和类变量,this关键字,封装,静态方法和静态代码块,通通给我看懂(概念版) 后续有相关示例
区分成员变量和类变量,this关键字,封装,静态方法和静态代码块,通通给我看懂(概念版) 后续有相关示例