#介面
抽象類別
抽象類別的概念我們可以用動物的繼承關係來說明問題,當我們寫父類別Animal類別時,其中有兩個方法sleep (),eat(),因為不知道具體是什麼動物而無法確定方法中寫什麼內容。這是我們就可以用抽象類別進行實作。
<?php //通过关键字abstract来声明抽象类 abstract class Animal{ protected $name; protected $age; //声明该方法是抽象方法 abstract public function sleep(); abstract public function eat(); }
基本語法:
abstract class 类名{ abstract 访问修饰符 函数名(参数列表); }
<?php abstract class Animal{ protected $name; protected $age; abstract public function sleep(); abstract public function eat(); } class Dog extends Animal{ } ......结果........ Fatal error: Class Dog contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (Animal::sleep, Animal::eat) in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\chouxiang.php on line 13
<?php abstract class Animal{ protected $name; protected $age; public function sleep(){ } public function eat(){ } }
<?php abstract class Animal{ protected $name; protected $age; abstract public function sleep(); abstract public function eat(); public function cry(){ } }
abstract public function eat();
#介面
介面的初衷和抽象類別是一樣的,不知道方法裡面怎麼實作的時候可以用介面來實作。而介面的定義是:給一些沒有實現的方法,封裝到一起,到某個類別要使用的時候,再根據具體情況把這些方法寫出來,介面的出現體現了高內聚低耦合的特徵。
<?php interface iTechnical{ public function fly(); }
interface 接口名{ //方法, 在接口中,所有的方法都不能有方法体, 即都是抽象方法 }
介面類別中所有的方法都預設是抽象方法。
所以並不需要寫abstract來宣告。介面的實作
interface iTechnical{ public function fly(); } class Dog implements iTechnical{ public function fly(){ echo '<br>飞'; } }
class Dog implements 接口1,接口2{ }
接口的出现可以说是对继承的一种补充,继承是层级的,不太灵活,而接口却没有它比抽象要灵活的多。并且实现接口在不打破继承关系的前提下,对子类的功能进行扩充。
它们两个的关系图可以理解为这样:
在上面的介绍中每个类都是可以被继承的,如果我们有一个类,我们不想让子类去重写里面的某个方法,或者不想让别的类去继承该类,就可以用到关键字final。final中文意思:最后的,最终的,可以用来修饰类或者方法。
final可以修饰方法或者类,如果修饰方法,则表示该方法不可以被继承类去重写,如果final 修饰了一个类,则表示该类不可以被继承。
基本语法:
final class 类名{ } class 类名{ final 访问修饰符 function 函数名(形参){} }
修饰类和修饰方法。
<?php final class A{ } class B extends A{ } .....结果..... Class B may not inherit from final class (A)
不能继承用final修饰的类。
<?php class A{ final public function sum($num1,$num2){ return $num1 + $num2; } } class B extends A{ public function sum($num1,$num2){ return $num1 + $num2; } } .....结果..... Cannot override final method A::sum()
从结果中可以看出来不能重写用final定义的方法。
在使用final时,只能用来修饰类或者方法,不能修饰属性。当一个类被final修饰后,类中的方法就不需要被final修饰,因为类都不能继承了,方法就不能重写。同时final修饰的类是可以被实例化的。
如果一个方法被final修饰,是可以被继承的,但是不能被重写。
<?php class A{ final public function sum($num1,$num2){ return $num1 + $num2; } } class B extends A{ } $b = new B(); echo $b -> sum(1,2); .......结果....... 3
在我们写单例模式时,说过当时的单例模式是不完善的,可以通过继承来得到不同的对象,在这里我们使用final关键字修饰单例类,防止继承,这样就不能通过继承的到别的对象。
类常量和普通的常量是一个概念,当不希望一个成员变量被修改,希望该变量的值是固定不变的。这时可以用const去修饰该成员变量,这样这个变量就自动成为常量。在类中的常量称为类常量。前面我们讲过定义常量有两种方式define()和关键字const,在类中必须使用const这种方式,使用define()是会报错的。
<?php class A{ const PI = 3.1415926; public function getPI(){ return A::PI; } } $a = new A(); echo $a -> getPI(); echo '<br>'; echo A::PI; ......结果...... 3.1415926 3.1415926
类常量的命名一般是全部用大写字母,中间用下划线隔开,同时常量前面没有$符号。常量必须在定义的时候就赋值。同时常量的前面不能有修饰符,默认是public。
常量的访问形式分为两种,一种是在类的内部进行访问,一种是在类的外部进行访问。
内部访问
通过 类名::常量名进行访问。
class A{ const PI = 3.1415926; public function getPI(){ return A::PI;//通过类名进行访问 } }
通过 self::常量名进行访问
class A{ const PI = 3.1415926; public function getPI(){ return self::PI;//通过类名进行访问 } }
可以通过self进行访问说明常量是属于类的,并不属于对象的。
外部访问
通过类名::常量名访问。
echo A::PI;
通过对象名::常量名访问
$a = new A(); echo $a::PI;
不过推荐使用第一种,通过类名进行访问。
如果一个类中有常量,则在继承的时候常量也是可以被继承的。同时常量的数据类型不能是对象。
PHP中抽象和接口应用让我们的更加清楚的把握需求的骨架,更好的搭建我们的代码体系。同时利用抽象和接口降低代码的耦合度。利于代码的扩展。
以上就是PHP基础教程十二之抽象、接口的内容,更多相关内容请关注PHP中文网(www.php.cn)!