这个类中定义的属性和方法,只能被这个类实例化的对象所用,我们称这样的属性和方法为一般属性、一般方法。
除了类常量可以直接被类调用,再讲两个成员:静态变量和静态方法,它们也可以直接被类拿来调用。
静态变量:
第四章34节我们讲过函数的静态变量,类的静态变量与函数的静态变量理解起来可以是一样的。
第8行定义了一个静态变量,同样是用关键字“static”定义静态变量,关键字“static”与访问修饰符没有先后顺序区分,可以 static public $count = 0 这样定义。可以省略访问修饰符,没有默认是“public”。
调用方式和类常量一样,用“::”方式调用:
类的静态变量$count在第13行、第25行,做了两次加一运算,所以最终结果是2。
注意:“::”调用静态变量不能省略“$”,“->”调用一般属性没有“$”。
静态属性有什么用?
对比来说:一般属性,他的值是隶属于该类的具体某个对象(虽然定义在类中),或者说,每个对象的同样的属性的值,有可能不一样。
静态属性就是:只隶属于类本身——也可以看做是所有对象的“共有数据”。
self关键字:
一般属性和一般方法在类中依靠关键字“$this”调用,PHP肯定也会有在类里调用类常量和静态变量的方式,那就是依靠关键字“self”,“self”就是自己的意思。
在第19行在类中的一般方法里调用了静态变量$count
当然如果在类里直接用类名也可以调用静态变量,比如第19行:
不推荐这样写,用“self”通用性更好。
“self::”不能调用一般属性和方法。
静态方法:
如果在一个方法的前面加上static关键字修饰,则就变成了静态方法。
静态方法同样隶属于类,而不是隶属于具体对象。使用方法跟静态属性类似:
类名::静态方法名();
从理念上,可以认为,静态方法是只隶属于类,而为所有对象所“共有”。
注意的地方:
静态方法的代码里不可以出现$this关键字,哪怕是用对象变量::调用。
所以,静态方法代码里不能调用一般属性和一般方法,只能调用静态变量、静态方法或类常量。
总结:
属于某个实例化的对象 | 属于类,所有对象的“共有数据” | ||||
一般属性 | 一般方法 | 类常量 | 静态变量 | 静态方法 | |
类外 | $对象->属性名 | $对象->方法名() | $对象::常量名 类名::常量名 | $对象::$变量名 类名::$变量名 | $对象::方法名() 类名::方法名() $对象->方法名() |
类内 | $this->属性名 | $this->方法名() | self::常量名 | self::$变量名 类名::$变量名 | self::方法名() 类名::方法名() |
注意:静态方法在类外也支持“$对象->方法名()”这样访问。静态变量不支持“$对象->属性名”这样访问。
静态变量和静态方法实际开发中用的挺多的。
上面的文件来自现在很流行的tp5.0框架的session文件代码,里面全是定义的静态方法,感兴趣的可以看看,耳濡目染下。