php 面向对象(静态属性和方法、常量属性、抽象类概念)
之前我们都是通过对象来访问类中的方法和属性的其实还可以通过类去访问它们,这样的方法和属性是“静态的”,必须用关键字static来声明
静态方法是以类作为作用域的函数。静态方法不能访问这个类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。如果修改了一个静态属性,那么这个类的所有实例都能访问到这个新值。
因为是通过类而不是通过实例来访问静态元素,所以访问静态元素时不需要引用对象的变量,而是使用::(两个冒号)来链接类名和属性或类名和方法
要从当前类(不是子类)中访问静态方法和属性,可以使用self关键字。
self指向当前类,就像伪变量$this指向当前对象一样。
根据定义我们不能在对象中调用静态方法,因此静态方法和属性又被称为类变量和类属性,因此不能在静态方法中使用伪变量$this
静态元素有很多有用的特性
1.它们在代码中的任何地方都可以用(假设你可以访问该类)。也就是说,你不需要在对象间传递类的实例,也不需要将实例存放在全局变量中,就可以访问类中的方法。
2.类的每个实例都可以访问类中定义的静态属性,所以你可以利用静态属性来设置值,该值可以被类的所有对象使用。
3.不需要实例对象就能访问静态属性和方法,这样我们就不用为了获取一个简单的功能而实例化对象。
==============================================================================
常量属性
PHP5可以在类中定义常量属性,和全局常量一样,类常量一旦设置就不能改变。
常量属性用const关键字来声明。常量不像常规属性那样以美元符号开头。按照惯例,只能用大写字母来命名常量。
常量属性只包含基本数据类型的值,不能将一个对象指派给常量。像静态属性一样,只能通过类而不能通过类的实例访问常量属性。引用常量时不需要用美元符号作为前导符,给已经声明过得常量赋值会引起解析错误。
当需要在类的所有实例中都能访问某个属性,并且属性值无需改变时应该使用常量
=================================================================================
抽象类
抽象类不能被直接实例化。抽象类中只定义(或部分实现)子类需要的方法。
子类可以继承它并且通过实现其中的抽象方法,使抽象类具体化。
可以用 abstract关键字定义一个抽象类。
大多数情况下,抽象类至少包含一个抽象方法。
抽象方法用abstract关键字声明,其中不能有具体内容。
你可以像声明普通类方法那样声明抽象方法,但要以分号而不是方法体结束。
abstract class ClassName{
abstract public function write();
}
创建抽象方法后,要确保所有子类中都实现了该方法,但实现的细节可以先不确定。
所以,抽象类的每个子类都必须实现抽象类中的所有抽象方法,或者把它们自身也声明为抽象方法。扩展类不仅仅负责简单的实现抽象类中的方法,还必须重新声明方法。新的实现方法的访问控制不能比抽象方法的访问控制更加严格。新的实现方法的参数个数应该和抽象方法的参数个数一样,重新生成对应的类型提示。
标签:function, PHP