基本知識
類別:具有相同屬性或方法的一類集合體。例如雪佛蘭汽車是一個雪佛蘭汽車類,賓士汽車是一個賓士汽車類,BMW汽車是一個寶馬汽車類,而這三個類又是汽車大類的子類。
物件:類別的一個具體實現,例如BMWQ5就是BMW汽車類別的一個具體實現。物件地使用是放在記憶體中的。一下讓我們了解一下物件在記憶體中的分配。
使用物件導向,就是靈活地使用以上兩個知識點。讓我們來建立並使用類別與物件
<?php /** *新建一个类 */ class newClass{ public $a; public $b; public function funA(){ echo "I am function A"; } public function funB(){ echo "I am function B"; } } /** *使用类创建对象 */ $opt=new newClass(); $opt->a="opt";//将opt对象中的a属性赋值为opt $opt->funA();//打印出"I am function A"?>
修飾符:在定義類別與類別中的屬性時,我們可以使用以下三個修飾符,若不加,則預設為public
public:權限最大
protected:權限範圍在其本身與其子類別
private:權限範圍僅在其本身
建構子與析構函式:在我們對類別實例化建立物件時,往往需要對物件進行初始化,這時,我們就需要在類別中定義一個建構方法。當我們使用完物件時,就需要釋放對象,以減少記憶體的使用,這時我們就需要使用析構方法。
在php中我們使用__construct()方法與__destruct(),如下程式碼
<?php class newClass{ public $a; public $b; public function __construct($a,$b){ $this->a=$a; $this->b=$b; echo "我是构造函数"; } public function __destruct(){ echo "我是析构函数"; } } ?>
封裝性
當我們在開發一些重要的程式模組時,常常不希望別人能輕易存取這些程式模組的數據,因此需要對這些數據進行封裝。這時我們要進行資料的存取控制,常常使用private關鍵字來封裝這些屬性與方法進行封裝。
如下:
<?php class privateClass { private $a; private $b; private function privateFun() { echo "我是封装的方法"; } } ?>
這樣,當我們建立物件時就無法呼叫私有的屬性與方法。但是我們可以透過使用魔術方法來對這些私有屬性與方法進行存取。
__set()與__get()的使用
透過__set()方法我們可以透過物件直接設定成員屬性值
透過__get()方法我們可以透過物件直接取得成員屬性值
<?php class setClass { private $a; private $b="ww"; public function __set($oldValue,$newvalue){ $this->$oldValue=$newvalue; } public function __get($newvalue){ return $newvalue; } } $opt= new setClass(); $opt->a="sss";//直接设置私有属性值 echo $opt->b;//直接读取私有属性值 ?>
__isset()與__unset()的使用
透過__isset()直接查看物件中私有屬性是否存在
透過__unset()直接刪除物件中的私有屬性
<?php class issetClass { private $a; private $b = 'www'; function __isset($privateName) { if (isset($privateName)) { return 1; } else { return 0; } } function __unset($privateName) { echo "销毁" . $privateName; } } $opt = new issetClass(); echo isset($opt->$b); var_dump(unset($opt->$b));?>
繼承性
當我們寫多個類別時,常常多個類別具有相同的屬性與方法,為了簡化程式碼我們引入了繼承的概念,子類別可以繼承父類別的一些屬性與方法,減少了冗餘程式碼地編寫。
如何寫繼承類別
我們使用關鍵字extends來寫子類別
<?php class parentClass{ } class childClass extends parentClass{ } ?>
#如上,childClass是parentClass的子類,php只支援單一繼承,也就是一個子類別只有一個父類,但父類可以有多個子類。
重寫父類別方法
當父類別中的方法不能滿足子類別的使用時我們可以重寫父類別方法。但當我們又想在子類別中使用父類別的方法時,我們可以使用如下語法:parent::方法名稱幾個重要的關鍵字
3.1 final
final可以修飾類與方法,不能修飾成員屬性;
被final修飾的類別不能繼承,而用final修飾的方法在子類別中不能被重寫
3.2 static
static可以修飾成員屬性與成員方法,不能修飾類別;
使用static修飾的成員與方法可以透過類別直接使用,使用以下語法:類別名稱::\$屬性名稱或方法名稱();
在類別中使用時透過以下語法:self::\$屬性名稱或方法名稱.
3.3 const
在類別中宣告常數使用const,而不是使用define( );
例如const TT=90當使用常數時直接使用以下語法self::常數名稱
3.4 instanceof
使用該關鍵字可以偵測某個實例是否是某個類別的實例。
3.5 trait
php只能進行單一繼承,但它同時提供了另類方式來進行程式碼重複使用,解決單一繼承問題。
如下
<?php trait testA { function a() { } } trait testB { function b() { } } class testC { use testA, testB; function c() { } } ?>
抽象技術
#用abstract關鍵字修飾的方法與類別稱為抽象方法或抽象類。
宣告抽象類別與抽象方法
<?php abstract class testClass { $a; $b; abstract function testFun(); abstract function testFun1(); public function optFun() { echo "抽象类中的抽象方法"; }//抽象类可以有非抽象方法 } class childClass extends testClass { function testFun() { echo "子类中实现抽象方法"; } function testFun1() { echo "子类实现抽象方法"; } } abstract child1Class extends testClass { }//子类是抽象方法可以不实现父类的抽象方法?>
抽象技術為子類別的宣告提供了一種規範,限制了類別的實例化(抽象類別不能實例化)。
介面技術
介面是一種特殊的抽象類,介面中只能宣告抽象類別與常數
宣告介面使用interface,實作介面使用implements,修飾符只能是預設的public;
一個子類別可以繼承多個介面,同時繼承一個父類別
<?php interface newInterface { const V = 12; abstract function fun1(); abstract function fun2(); } interface newInterface1 { abstract function fun3(); abstract function fun4(); } class parentClass { function fun5() { echo "fun5"; } } class optClass extends parentClass implements newInterface, newINterface1 { function fun1() { echo "fun1"; } function fun2() { echo "fun2"; } function fun3() { echo "fun3"; } function fun4() { echo "fun4"; } } ?>
多態
在php中多態地實作需要一個類別透過多個子類別地繼承實現,如果一個類別的方法在多個子類別中重寫並實現不同的功能,我們稱之為多態。
推薦教學:《PHP教學》
以上是php物件導向簡單概括的詳細內容。更多資訊請關注PHP中文網其他相關文章!