欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP5.3中的静态变量

程序员文章站 2022-03-23 23:17:45
...
一、静态变量
1.静态变量是只存在于作用域的变量,不过,在函数执行完成以后,这种变量的值不会丢失,也就是说,在下一次调用这个函数时,变量仍会记得原来的值。
2.将表达式计算出来的结果付给静态变量是不合法的。表达式是指自身的值会发生变化的任何语句,例如(1+1),$variable,anyfunc()都是表达式。
3.你也许会想,定义静态变量似乎并不是很有用,因为可以用全局变量轻松地获取同样的结果。然而,全局变量可以被所有函数访问,所以如果两个或者更多本来应该是独立的函数使用了相同名称的变量,就会导致冲突;并且,比起引入全局变量,使用静态变量也不需要更多的语法。因此,在只有一个函数需要访问某个变量时,我们应该优先使用静态变量,而不是全局变量。

二、类中静态元素的使用
4.在类中,static关键字有两种主要的用法,一种是用来定义静态成员,另一种是用来定义静态方法。
5.静态成员是一种类变量,可以把它看成是属于整个类而不是属于类的某个实例。与一般的实例变量不同的是,静态成员只保留一个变量值,而这个变量值对所有的实例都是有效的,也就是说,所有的实例共享这个成员。
6.$this只表示当前类的实例,self::表示类本身(后面加$)
7.作用域限定操作符::
通过作用域限定操作符,我们可以使用两个系统定义的作用域:self和parent。此外,php5.3还提供了static作用域。self表示的是当前类的作用域,不过与$this不同的是,它不表示类的某个特定的实例。在类之外的代码中不能使用这个操作符,而且它不能识别自己在继承树层次结构中的位置。也就是说,在扩展类中使用self作用域时,self可以调用基类中声明的方法,但它调用的总是已经在扩展类中重写的方法。(相当于java中方法的覆盖,明确调用父类的方法用parent)

重写父类的静态变量就在子类中定义一样的静态变量

Php代码

<span style="font-size: small;"><?php

class aaa

{

function bbb(){

echo '用双冒号::调用类的方法!';

}

}

//调用1:

$a = new aaa();

$a->bbb();

//调用2:

aaa::bbb();

?> </span>

两种方法得到的结果是一样的.

想不明白,为什么普通方法bbb也可以直接用类名::调用,这好像和java里面的不一样



Java代码

<span style="font-size: small;">Test.java

class Test{

//普通方法

public void eat(){

System.out.println("no-static!");

}

//静态方法

public static void show(){

System.out.println("static!");

}

//main方法

public static void main(String args[]){

Test obj=new Test();

obj.eat(); //输出no-static!

obj.show();//方法属于类,类的实例当然也能访问,但是eclipse等编辑器中会黄色提示建议用类名直接调用

//(The static method show() from the type Test should be accessed in a static way)

Test.show();//输出static

//Test.eat();//报错 无法从静态上下文中引用非静态 方法 eat() php却可以忍受。。。

}

}</span>

个人理解:只要被调用的普通方法里不出现$this->xx ($this只表示当前类的实例),普通方法也可以认为是直接属于类的,所以可以直接用类名调用,而不像java中方法必须要声明为static才能用类名直接调用(php6在静态方法的操作方面做了几处修改,首先在访问非静态方法时,不再使用::操作符!这种方式要被干掉了吧。。。)


帮助父类调用子类的方法
php5.3中提出的static::作用域使我们不再需要使用self::和parent::。当希望指向最终的实现类时,就可以使用static::,这个限定符会在代码执行之前立即计算出继承层次结构上最后那个类的成员。这一过程被称为延迟绑定。好像没看出有什么用,直接在父类中new那个最终实现类的对象然后调用不就行了吗?但是如果你不知道那个最终类叫什么,覆盖的方法实现了什么样的效果,这时候似乎就有用了。static::作用域也可以应用在静态方法上,这样从父类可以静态的调用子类的方法。