PHP基礎教學十二之抽象、接口
本節講解的內容
#介面
類別常數
前言
在PHP中的物件導向是透過定義類,來完成物件的範例化,而PHP的抽象類別和介面類別可以說是類別的一種規範,透過定義這兩種類別來對類別進行強制約束,雖然這兩種都是對類別的約束,但本質上他們還是有區別的。抽象類別
抽象類別的概念我們可以用動物的繼承關係來說明問題,當我們寫父類別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
登入後複製當一個類別繼承了抽象類別後,在子類別中就需要實作父類別的所有抽象方法 - 上面報的錯誤就是說在父類別中包含2個抽象方法,子類別必須實作該抽象方法。而關於抽象類別的特點可以總結如下:
- 抽象類別是不能被範例化的,不能透過抽象類別來new一個對象,會報一個Cannot instantiate abstract class錯誤。
- 抽象類別中可以沒有抽象方法的,在抽象類別中都是普通方法,但是類別名稱是用abstract修飾的。
<?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 接口名{
//方法, 在接口中,所有的方法都不能有方法体, 即都是抽象方法
}
登入後複製介面類別和抽象類別大致一樣,那介面具體是什麼呢?上面有說到抽象類別就好比一台筆記本的架子、模板,然後根據模板創建具體的筆記本,而沒有筆記本都有幾個usb接口,而接口類就好比這些筆記本上的接口,是一個擴展的實現。就像動物一樣都繼承了動物特有的特性吃,睡等,但是突然一隻動物在別的地方實現了寫字的本領,這種本領就是透過介面進行擴充的。
介面的命名一般是在類別名稱的第一個字母是小寫的i開頭。在interface 接口名{ //方法, 在接口中,所有的方法都不能有方法体, 即都是抽象方法 }
介面類別中所有的方法都預設是抽象方法。
所以並不需要寫abstract來宣告。介面的實作
- 我們定義一個介面當然是讓別的類別去實現的,這裡說的是實現,而不是繼承,介面和別的類之間是實現的關係,也就是類別實現了某一接口,用implements關鍵字實現。 當然在子類別中必須實作介面中所有的方法。
interface iTechnical{ public function fly(); } class Dog implements iTechnical{ public function fly(){ echo '<br>飞'; } }
登入後複製 - 關於介面的特性有以下幾點:
- 介面類別和抽象類別一樣是不能被實例化的。
- 介面中所有的方法都不能有主體,因為都是抽象方法。
- 一個類別可以實作多個介面,逗號隔開(繼承只能是一個)
class Dog implements 接口1,接口2{ }
登入後複製 - 介面中可以有屬性,但只能是常數,預設是public, 但不能用public 明確修飾
一個介面不能繼承其它的類別,但是可以繼承別的介面#########抽象和介面的區別#########在PHP中繼承是單繼承的,也就是一個類別最多只能有一個父類,而這種單一繼承的機制可以保證類別的純潔性。但是這種機制對子類別功能擴展有一定的影響。 ###
接口的出现可以说是对继承的一种补充,继承是层级的,不太灵活,而接口却没有它比抽象要灵活的多。并且实现接口在不打破继承关系的前提下,对子类的功能进行扩充。
它们两个的关系图可以理解为这样:
final的使用
在上面的介绍中每个类都是可以被继承的,如果我们有一个类,我们不想让子类去重写里面的某个方法,或者不想让别的类去继承该类,就可以用到关键字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)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。
