第七章:第3节 PHP面向对象——静态变量和静态方法

更新于:2020-02-06 23:55:58

这个类中定义的属性和方法,只能被这个类实例化的对象所用,我们称这样的属性和方法为一般属性、一般方法。


除了类常量可以直接被类调用,再讲两个成员:静态变量和静态方法,它们也可以直接被类拿来调用。


静态变量:


第四章34节我们讲过函数的静态变量,类的静态变量与函数的静态变量理解起来可以是一样的。

1.png

第8行定义了一个静态变量,同样是用关键字“static”定义静态变量,关键字“static”与访问修饰符没有先后顺序区分,可以 static public $count = 0 这样定义。可以省略访问修饰符,没有默认是“public”。


调用方式和类常量一样,用“::”方式调用:

1.png

1.png

类的静态变量$count在第13行、第25行,做了两次加一运算,所以最终结果是2。


注意:“::”调用静态变量不能省略“$”,“->”调用一般属性没有“$”。


静态属性有什么用?


对比来说:一般属性,他的值是隶属于该类的具体某个对象(虽然定义在类中),或者说,每个对象的同样的属性的值,有可能不一样。

静态属性就是:只隶属于类本身——也可以看做是所有对象的“共有数据”。


self关键字:


一般属性和一般方法在类中依靠关键字“$this”调用,PHP肯定也会有在类里调用类常量和静态变量的方式,那就是依靠关键字“self”,“self”就是自己的意思。


1.png


在第19行在类中的一般方法里调用了静态变量$count


1.png

1.png


当然如果在类里直接用类名也可以调用静态变量,比如第19行:


1.png

不推荐这样写,用“self”通用性更好。


“self::”不能调用一般属性和方法。


静态方法:


如果在一个方法的前面加上static关键字修饰,则就变成了静态方法。

静态方法同样隶属于类,而不是隶属于具体对象。使用方法跟静态属性类似:

类名::静态方法名();

从理念上,可以认为,静态方法是只隶属于类,而为所有对象所“共有”。


注意的地方:

静态方法的代码里不可以出现$this关键字,哪怕是用对象变量::调用。


1.png

1.png

1.png

所以,静态方法代码里不能调用一般属性和一般方法,只能调用静态变量、静态方法或类常量。



总结:



属于某个实例化的对象属于类,所有对象的“共有数据”

一般属性一般方法类常量静态变量静态方法
类外$对象->属性名$对象->方法名()

$对象::常量名

类名::常量名

$对象::$变量名

类名::$变量名

$对象::方法名()

类名::方法名()

$对象->方法名()

类内$this->属性名$this->方法名()self::常量名

self::$变量名

类名::$变量名

self::方法名()

类名::方法名()


注意:静态方法在类外也支持“$对象->方法名()”这样访问。静态变量不支持“$对象->属性名”这样访问。


静态变量和静态方法实际开发中用的挺多的。


1.png

上面的文件来自现在很流行的tp5.0框架的session文件代码,里面全是定义的静态方法,感兴趣的可以看看,耳濡目染下


本节学习代码》》》