时间:2021-07-01 10:21:17 帮助过:22人阅读
二、类中静态元素的使用
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::作用域也可以应用在静态方法上,这样从父类可以静态的调用子类的方法。