前几天写了一篇关于php面向对象基础知识的博客,这两天看了php面向对象的高级特性,写出来记录一下吧,方便以后拿出来复习。
面向对象除了最基本的定义类之外,最主要就是因为面向的一些高级特性,运用这些高级特性,我们可以写出更加合理优雅的代码(ps:上述官方语言都是在网上摘抄,由于没有多少面向对象编程的经验,自己仅仅是记录自己的学习心得)。闲话扯完,接下来说说面向对象。
(1)静态方法和属性:
在面向对象的基础中,我们对类中属性的访问几乎都是首先进行类的实例化,得到实例化后的对象,通过对象进行访问。其实在面向对象中,也不仅仅只能通过对象访问类的属性,还可以通过类访问属性 ,这样的属性和方法就是“静态的”,必须用static关键字来声明。
1 class StaticExample{ 3 static public $num=0; 5 static public function sayHello(){ 7 print "hello world!"; 9 } 11 }
静态方法可以不能访问这个类的普通属性,因为那些属性属于一个对象(通俗说就是普通属性在对象中有效),静态方法可以访问静态属性。一个实例化的对象可以访问静态方法,但不可以访问静态属性。所以,通过类访问静态元素时使用::(两个英文冒号)来连接类名和属性或类名和方法。
1 print StaticExample::$num; 2 StaticExample::sayHello();
通过上面这种访问方式,就可以将类的静态属性$num打印出来。上面这种方式是在类的外部访问静态属性和静态方法时的做法。既然这样,那如何在类的内部访问静态属性和静态方法呢?php给出了一个关键字self,self关键字指向当前类,与$this不同,$this代表的是当前对象。
1 <?php 2 class StaticExample{ 3 static public $num=0; 4 static public function say(){ 5 self::$num++; 6 var_dump(self::$num); 7 } 8 } 9 $staticExam=new StaticExample(); 10 $staticExam->say(); 11 ?>
输出结果为int(1)。
(2)常量属性:
常量属性,顾名思义就是设置后不可改变的量,当一个可以访问的属性的值无需改变时,就应该使用常量。常量使用关键字const来声明,常量不以美元符号开头,通常使用大写字母来命名常量。可定义为常量的值只能是基本数据类型的值,只能通过类而不能通过类的实例(对象)来访问常量属性,引用常量时不需要用$符号,访问时通过“类名::常量”的形式访问。
(3)抽象类:
抽象类:一种不能被直接实例化的类,任何一个类,如果其中至少有一个方法被声明为抽象的,则这个类就必须被声明为抽象的,被定义为抽象的方法只是声明了其调用方式,不能有具体的功能实现。当继承一个抽象类的时候,子类必须定义父类中所有的抽象方法。这些方法在访问控制上至少要和父类一致(或者更为宽松)