前言
静态变量用的不多,但是静态的类属性、类方法,则是工作中必不可少的一个知识点。
基础语法
先看代码,下面逐一进行解释。
“::”是什么?
它是两组冒号,调用静态资源专属语法,基本功能接近-。
定义静态方法、属性
在属性、方法前加static关键字,就可以将其定义为静态。
调用静态属性
必须通过类::$属性名的形式,不能使用$this-属性名。
调用静态方法
可以通过类::方法名()的形式,也可以通过$this-方法名()的形式。
关于$this伪变量
因为静态调用没有new类()的过程,所以$this不存在,调用就报错(参考代码16行)需改为self::$属性(参考11行)
实战意义
不用new,用起来省事,这是表面上最容易看到的优点。
除此之外,看一个例子
下面的代码,执行结果是什么?
会报错!因为$x是局部变量,离开函数后就销毁了。
看另一个例子
执行后会怎样?(SoDevel这个类来自第一段代码)
不会报错,可以正常使用。
为什么会这样?
普通局部变量,一旦函数执行完毕就销毁,但是静态变量不会。
静态类属性就更牛了,不光不会销毁,还可以被其他局部环境所调用。(静态变量虽然没有销毁,但是只能在定义它的函数内使用)
这样有什么意义?
意义大了。
在面向对象编程中,我们主要代码都在局部环境(也就是类方法里),而在方法中定义的变量,都是局部变量。就算使用$this-var定义成类属性,也只能在类的内部使用。
而静态类属性可以无视所有规则,在任何地方都能随时进行赋值、读取操作。
你用过MVC结构的框架吗?
在控制器里定义变量,都需要用$this-assign()或者类似的语法,传递给模板。
如果使用静态类属性,就可以免去这个过程,模板拿来即用。
那为什么框架不这样做?
因为某些特定情况不好处理,并且会导致性能下降(静态资源直到程序执行完毕才释放)
总结
昨天少说了一句话,在PHP中所有全局变量都存储于静态内存区(但他们并不是静态变量)。
所以,你知道全局变量在什么时候销毁吗?
预报:明天给大家讲单例模式,它是基于静态特性实现的。