静态成员
定义:指的是逻辑上被所有的对象所共享,属于类的成员称之为类的静态成员!
静态成员在类中的逻辑结构:
存在:表明该静态属性或该静态方法是对象所共有.
声明:表明该属性或方法是对象所独有.
场景:若要完成一个学生计数器,当学生被实例化一次,$count就加1,当对象销毁时,$count就减1。
如果使用成员属性:
能否完成我们所需要的业务逻辑呢?
结果如下:
很显然没有成功,那么这是为什么呢?
由上图我们得知,如果我们要完成一个计数器,首先这个count不能是当前对象独有的数据,因为每次实例化得到的count是当前对象的count,与下次实例化得到的count 不同,count的内容归当前对象所独有,只有当count是对象所共有的数据是,结果才能改变。那么我们可以通过全局变量来实现。
使用全局变量:
结果会正确吗?
结果完美!
定义了全局变量,如果想要在类中使用需要使用$GLOBALS[‘变量名’] 来进行访问。
但是思考一下,我们这样定义了全局变量 count,可是这个count除了可以表示学生数量是不是也可以表示别的业务逻辑?
全局变量不应该属于任何的对象或者类。$count 与 Student没有丝毫的逻辑上的联系!
显然,应该找一个能够被对象所共有并且能够在多个方法内使用的变量,还应该与当前的对象类有逻辑的关系的数据。
可以使用类的静态成员!
存在:表明该静态属性或该静态方法是对象所共有.
声明:表明该属性或方法是对象所独有.
回到上面的静态成员逻辑结构图
静态属性存在是什么意思?
就是指这个数据本身存在类里面,而不是实例化对象后存在当前对象内。
比如我们var_dump一个含有静态属性的对象,看看它内部有什么
结果如下:
我们看到了,除了一个成员属性names,并没有显示count,说明了静态属性并不是在实例化后才有,而是在类里面已经存储过了。
静态成员语法
声明
额外增加一个 static 关键字!
属性:
访问
->访问对象成员
因此,应该使用类访问,
类 :: 成员!
::,静态访问符,类访问符(范围解析操作符)
在构造方法中,访问到,++!
类似于$this,同样存在一个self关键字(注意没有$),在类中,代表当前类!
$this:这个对象, $this->
self:类自己,self::
使用静态成员:
实例化
结果如下:
完美!
注意
1, 访问上,静态成员只能使用::静态访问符号访问!
典型的,::前应该是类,类内可以使用self。
但是,php支持: 对象::静态成员!