1. 程式人生 > >談談我對php中面向物件的理解

談談我對php中面向物件的理解

轉載自:http://www.php.cn/php-weizijiaocheng-372376.html

今天來和大家介紹一下PHP的面向物件。說到面向物件,我不得不提一下面向過程,因為本人在初學時,常常分不清楚面向物件和麵向過程,

面向物件程式設計(OOP)是我們程式設計的一項基本技能,PHP5對OOP提供了良好的支援。如何使用OOP的思想來進行PHP的高階程式設計,對於提高PHP程式設計能力和規劃好Web開發構架都是非常有意義的。下面我們就通過例項來說明使用PHP的OOP進行程式設計的實際意義和應用方法。

  我們通常在做一個有資料庫後臺的網站的時候,都會考慮到程式需要適用於不同的應用環境。和其他程式語言有所不同的是,在PHP中,操作資料庫的是一系列的具體功能函式(如果你不使用ODBC介面的話)。這樣做雖然效率很高,但是封裝卻不夠。如果有一個統一的資料庫介面,那麼我們就可以不對程式做任何修改而適用於多種資料庫,從而使程式的移植性和跨平臺能力都大大提高。

下面就來給大家介紹一下它們的區別:

面向物件專注於由哪個物件來處理一個問題。

其最大特點是由一個一個具有屬性和功能的類,從類中拿到物件,進而處理問題。

面向過程專注於解決一個問題的過程。其最大特點是由一個一個的函式去解決處理這個問題的一系列過程。

一、面向物件基礎

面向物件

1、什麼是類?
具有相同屬性(特徵)和方法(行為)的一系列個體的集合,類是一個抽象的概念。

2、什麼是物件?
從類中,拿到的具有具體屬性值的個體,稱為物件。物件是一個具體的個體。
eg:人類;張三

3、類和物件的關係?
類是物件的抽象化!物件是類的具體化!
類僅僅表明這類物件有哪些屬性,但是不能有具體的值,所以類是抽象的。
物件是將類的所有屬性賦值後,產生具體的個體,所有物件是具體的。

類的宣告與例項化

1、如何宣告一個類:

class 類名{
訪問修飾符 $屬性[=預設值];
[訪問修飾符] function 方法(){}
}

2、宣告一個類的注意事項:
①類名只能有字母數字下劃線組成,開頭不能是數字,必須符合大駝峰法則;
②類名必須使用class修飾,類名後面一定不能有();
③屬性必須要帶訪問修飾符,方法可以不帶訪問修飾符。

3、例項化物件及物件屬性方法的呼叫:
$物件名 = new 類名(); //()可以不帶

類外部呼叫屬性和方法:
$物件名 -> $屬性名; //使用->呼叫屬性時,屬性名不能帶$符號

類內部呼叫屬性和方法:
$this -> $屬性名;

建構函式

1、什麼是建構函式?


建構函式是類中的一個特殊函式,當我們使用new關鍵字例項化物件時,相當於呼叫了類的建構函式。

2、建構函式有什麼作用?
例項化物件時,自動呼叫,用於給物件的屬性賦初值!

3、建構函式的寫法:
①建構函式名,必須與類同名
[public] function Person($name){
$this -> name = $name;
}
②使用魔術方法__construct
[public] function __construct($name){
$this -> name = $name;
}
4、建構函式注意事項:
①第一種寫法,建構函式名必須與類同名!!!!
②如果一個類沒有手寫建構函式,則系統預設會有一個空參構造,因此可以使用new Person();
如果我們寫了帶引數的建構函式,則將不會再有空參構造,也就是不能直接使用new Person();
Person後面的()中的引數列表,必須符合建構函式的要求!!!!
③如果兩種建構函式同時存在,將使用__construct。

5、解構函式:__destruct():
①解構函式在物件被銷燬釋放之前自動呼叫;
②解構函式不能帶有任何的引數;
③解構函式常用於物件使用完以後,釋放資源,關閉資源等。

6、魔術方法:
PHP中,給我們提供一系列用__開頭的函式,這些函式無需自己手動呼叫,
會在合適的時機自動呼叫,這類函式稱為魔術稱為魔術函式。
eg:function __construct(){} 在類new一個物件時自動呼叫
function __destruct(){} 在物件被銷燬時自動呼叫


我們要求,除了魔術方法之外,自定義的函式與方法不能使用__開頭。

最後,一般對於功能比較複雜的類,我們會單獨的寫到一個類檔案中。

類檔案的命名,同一小寫,使用"類名小寫.class.php"的方式命名。
在其他檔案中使用這個類時,可以使用include匯入這個".class.php"檔案。

二、封裝和繼承

1、什麼是封裝?
通過訪問修飾符,將類中不需要外部訪問的屬性和方法進行私有化處理,以實現訪問控制。

*注意:是實現訪問控制,而不是拒絕訪問。也就是說,我們私有化屬性後,需要提供對應的方法,讓使用者通過我們提供的方法處理屬性。

2、封裝的作用?
①使用者只關心類能夠提供的功能,不關心功能實現的細節!(封裝方法)
②對使用者的資料進行控制,防止設定不合法資料,控制返回給使用者的資料(屬性封裝+set/get方法)

3、實現封裝操作?
①方法的封裝
對於一些只在類內部使用的方法,而不像對外部提供使用,那麼,這樣的方法我們可以使用private進行私有化處理。

1private function formatName(){} //這個方法僅僅能在類內部使用$this呼叫2 function showName(){3 $this -> formatName();4 }

②屬性的封裝+set/get方法
為了控制屬性的設定以及讀取,可以將屬性進行私有化處理,並要求使用者通過我們提供的set/get方法進行設定

1private $age;2 //set方法3 function setAge($age){4 $this->age=$age;5 }6 //get方法7 function getAge(){8 return $this->age;9 }

$物件->getAge();
$物件->setAge(12);

③屬性的封裝+魔術方法

1__get(  ->   __set(, ->= }

$物件->age; //訪問物件私有屬性時,自動呼叫__get()魔術方法,並且將訪問的屬性名傳給__get()方法;
$物件->age=12; //設定物件私有屬性時,自動呼叫__set()魔術方法,並且將設定的屬性名以及屬性值傳給__set()方法;

注意:在魔術方法中,可以使用分支結構,判斷$key的不同,進行不同操作。

4、關於封裝的魔術方法:
①__set($key,$value):給類私有屬性賦值時自動呼叫,呼叫時給方法傳遞兩個引數:需要設定的屬性名,屬性值。
②__get($key,$value):讀取類私有屬性時自動呼叫,呼叫時給方法傳遞一個引數,需要讀取的屬性名;
③__isset($key):外部使用isset()函式檢測私有屬性時,自動呼叫。
>>>類外部使用isset();檢測私有屬性,預設是檢測不到的。false
>>>所以,我們可以使用__isset();函式,在自動呼叫時,返回內部檢測結果。

1function __isset($key){2 return isset($this -> $key);3 }

當外部使用isset($物件名->私有屬性);檢測時,將自動呼叫上述__isset()返回的結果!

④__unset($key):外部使用unset()函式刪除私有屬性時,自動呼叫;
1 function __unset($key){ 2 unset($this -> $key); 3 } 
當外部使用unset($物件名->私有屬性);刪除屬性時,自動將屬性名傳給__unset(),並交由這個魔術方法處理。

繼承的基礎知識:

1、如何實現繼承?
給子類使用extends關鍵字,讓子類繼承父類;
class Student extends Person{}

2、實現繼承的注意事項?
①子類只能繼承父類的非私有屬性。
②子類繼承父類後,相當於將父類的屬性和方法copy到子類,可以直接使用$this呼叫。
③PHP只能單繼承,不支援一個類繼承多個類。但是一個類進行多層繼承。
class Person{}
class Adult extends Person{}
class Student extends Adult{} 
//Student 類就同時具有了Adult類和Person類的屬性和方法

3、方法覆蓋(方法重寫)
條件一: 子類繼承父類
條件二:子類重寫父類已有方法

符合上述兩個條件,稱為方法覆蓋。覆蓋之後,子類呼叫方法,將呼叫子類自己的方法。
同樣,除了方法覆蓋,子類也可以具有與父類同名的屬性,進行屬性覆蓋。

如果,子類重寫了父類方法,如何在子類中呼叫父類同名方法?

partent::方法名();
所以,當子類繼承父類時,需在子類的構造中的第一步,首先呼叫父類構造進行復制。

1function __construct($name,$sex,$school){2 partent::__construct($name,$sex);3 $this -> school = $school;4 }
三、PHP關鍵字

1、final
①final修飾類,此類為最終類,不能被繼承!
②final修飾方法,此方法為最終方法,不能被重寫!
③final不能修飾屬性。

2、static
①可以修飾屬性和方法,分別稱為靜態屬性和靜態方法,也叫類屬性,類方法;
②靜態屬性,靜態方法,只能使用類名直接呼叫。
使用"類名::$靜態屬性" , "類名::靜態方法()"
Person::$sex; Person::say();
③靜態屬性和方法,在類裝載時就會宣告,先於物件產生。
④靜態方法中,不能呼叫非靜態屬性或方法;
非靜態方法,可以呼叫靜態屬性和方法。 
(因為靜態屬性和方法在類裝載時已經產生,而非靜態的屬性方法,此時還沒有例項化誕生)
⑤在類中,可以使用self關鍵字,代指本類名。

1class Person{2 static $sex "nan";3 function say(){4 echo self::$sex;5 }6 }

⑥靜態屬性是共享的,也就是new出很多物件,也是共用一個屬性。

3、const關鍵字:
在類中宣告常量,不能是define()函式!必須使用const關鍵字。
與define()宣告相似,const關鍵字宣告常量不能帶$,必須全部大寫!
常量一旦宣告,不能改變。呼叫時與static一樣,使用類名呼叫Person::常量。

4、instanceof操作符:
檢測一個物件,是否是某一個類的例項。(包括爹輩,爺爺輩,太爺爺輩……)

1$zhangsan instanceof Person;

【小總結】幾種特殊操作符

 . 只能連線字串; "".""
 => 宣告陣列時,關聯鍵與值["key"=>"value"]
 -> 物件($this new出的物件)呼叫成員屬性,成員方法;
④ :: ①使用parent關鍵字,呼叫父類中的同名方法:parent::say();
②使用類名(和self)呼叫類中的靜態屬性,靜態方法,以及常量。


四、單例

單例模式也叫單態模式。可以保證,一個類只能有一個物件例項。

實現要點:
①建構函式私有化,不允許使用new關鍵字建立物件。
②對外提供獲取物件的方法,在方法中判斷物件是否為空。
如果為空,則建立物件並返回;如果不為空則直接返回。
③例項物件的屬性以及獲取物件的方法必須都是靜態的。
④之後,建立物件只能使用我們提供的靜態方法。
eg:$s1 = Singleton::getSingle();

五、物件序列化和魔術方法

***關鍵詞:clone與__clone、__antoload()、序列化與反序列化(序列化與反序列化)、型別約束、魔術方法小總結(12個)

clone與__clone


1、當使用=講一個物件,賦值給另一個物件時,賦的實際是物件的地址。
兩個物件指向同一地址,所以一個物件改變,另一個也會變化。
eg: $lisi = $zhangsan;
2、如果想要將一個物件完全克隆出另一個物件,兩個物件是獨立的,互不干擾的,
則需要使用clone關鍵字;
eg: $lisi = clone $zhangsan; //兩個物件互不干擾
3、__clone():
①當使用clone關鍵字,克隆物件時,自動呼叫clone函式。
②__clone()函式,類似於克隆時使用的建構函式,可以給新克隆物件賦初值。
③__clone()函式裡面的$this指的是新克隆的物件
某些版本中,可以用$that代指被克隆物件,絕大多數版本不支援。
4、__toString()
當使用echo等輸出語句,直接列印物件時呼叫echo $zhangsan;
那麼,可以指定__toString()函式返回的字串;

1function __toString(){2 return "haha";3 }4 echo $zhangsan//結果為:haha

5、__call()
呼叫類中未定義或未公開的方法時,會自動執行__call()方法。
自動執行時,會給__call()方法傳遞兩個引數;
引數一:呼叫的方法名
引數二:(陣列)呼叫方法的引數列表。

__antoload()


①這是唯一一個不在類中使用的魔術方法;
②當例項化一個不存在的類時,自動呼叫這個魔術方法;
③呼叫時,會自動給__autoload()傳遞一個引數:例項化的類名
所以可以使用這個方法實現自動載入檔案的功能。

1function __autoload($className){2 include    "class/".strtolower($className).".class.php";3 }4 

相關推薦

談談php面向物件理解

轉載自:http://www.php.cn/php-weizijiaocheng-372376.html今天來和大家介紹一下PHP的面向物件。說到面向物件,我不得不提一下面向過程,因為本人在初學時,常常分不清楚面向物件和麵向過程,面向物件程式設計(OOP)是我們程式設計的一項基本技能,PHP5對OOP提供了良

Python面向物件的一些總結

      回過頭來再看看關於面向物件的基礎知識,然後做個總結。也算是重新梳理一遍吧。首先,總的來說面向物件包含封裝、繼承、多型三個大特性。這部分內容主要總結的是封裝。        我所理解的封裝其實就是打包起來,或者說是隱藏起來的意思,通過封裝將類和物件有機地統一起來,

簡單談談Java Class.forName()、Class.class、例項物件.getClass() 三種獲取位元組碼物件理解?(內含程式碼分析和總結)

首先得明白的知識點: 1靜態屬性初始化載入類的時候初始化( 只會初始化一次),而非靜態屬性的初始化就是new類例項物件的時候初始化的 2三種獲取位元組碼物件的共同點就是都會預先的判斷記憶體是否已經載入此類,弱沒有載入,則會把.class檔案裝入到記憶體,若是載入了,則會根據class檔案生成例

java面向物件思想的理解

        java是一門純粹的面向物件的語言。面向物件這種程式設計模式它將現實世界中的一切事物都看作是物件,例如,一個人是一個物件,汽車、飛機、小鳥等等,都是物件;它強調從物件出發,以物件為中心用人類的思維方式來認識和思考問題。每個物件都具有各自的狀態特徵(也可以稱為

談談Java泛型的理解

eg1: Map map = new HashMap(); map.put("key" , "xuqiang"); String s = (String) map.get("key"); 大家都知

談談這個網際網路時代的理解

那麼在網際網路時代來說,我們所希望的事情是,使得每個人的思想都可以有一個表達的地方,並且能夠很快速的把我的思想傳輸給需要這資訊的人。而更火熱的移動網際網路行業,也有自己本身的特點。新時代的網際網路終端具有獨特的性質,比如隨身攜帶,地理定位,使用時間碎片化,可獲取的真實社交關係等。因為無線終端的這些特性,我們的

面試題(一)- 談談資料庫索引的理解

轉載自《http://www.cnblogs.com/newpanderking/p/3781043.html》 1、首先要明白無名無實莫要用索引:因為資料中的記錄很多,為了方便我們查詢,提高查詢的效率; 2、索引的原理:對要查詢的欄位建立索引其實就是把該欄位按照一定的

談談onvif協議測試的理解(工具,思路,方法)

任何急功近利的事情都是扯蛋的,要想做好某個專項測試也是一樣的道理,不明白協議本身的工作原理,不深入學習一下就急於上手測試,反而會一路碰壁,測試思路和方法錯了,就算用對工具也是白乾一場,本文就我自己對onvif測試的理解拋一些看法和拙見,歡迎舉手拍磚!一個真實情況是,在沒深刻理解之前,我自己對onvif的測

談談MySQL儲存引擎的理解

  這篇文章並不是在說某個技術,更多的是一種感悟,一種學習技術的方法,相信讀者如果認真閱讀這篇文章,一定會比學習一個單純的技術收穫更大(就是這麼自信^o^)。    到底什麼是儲存引擎,儲存引擎這個概念在Oracle中是沒有的。或者說Oracle中只有一種儲存引擎。  在說具

經驗總結-談談LayoutInflaterinflate方法的認識

我為什麼要寫這篇博文呢,就是自己太以為是了,總認為LayoutInflater這個類沒什麼,只是個用來插入佈局的類而已,但是我每次用到這個類的時候,當呼叫inflate方法插入佈局時,總是對它那幾個過載方法的引數不瞭解,很難下手,所以自己決定把這個方法弄清楚,那現在開始我的

談談Manacher算法的理解

位置 直接 簡化 rar img 左右 分享圖片 [ ] 由於 Manacher算法其實是求字符串裏面最長的回文。 ①在學習該算法前,我們應該知道回文的定義:順序讀取回文和逆序讀取回文得到的結果是一樣的,如:abba,aba。 那麽我們不難想到,在判斷一個字符串s

談談SOFA模組化的理解

今天我們談談SOFA模組化,首先看一段SOFA的介紹: SOFABoot是螞蟻金服開源的基於Spring Boot的研發框架,它在Spring Boot的基礎上,提供了諸如 Readiness Check,類隔離,日誌空間隔離等能力。在增強了Spring Boot的同時,SOFABoot提供了讓使用者可以在

談談面向物件以及類與物件理解

對於剛接觸JAVA或者其他面向物件程式語言的朋友們來說,可能一開始都很難理解面向物件的概念以及類和物件的關係。面向物件首先,一言不和先百度,得到如下定義:一切事物皆物件,通過面向物件的方式,將現實世界的事物抽象成物件,現實世界中的關係抽象成類、繼承,幫助人們實現對現實世界的抽

php 談談session, cookies和jwt的理解

最近在做專案重構,因為核心功能僅以restful風格介面提供,因此對於會話管理這一部分,目前考慮使用jwt(Json Web Token)。本文是我在專案開發過程中對這幾種會話管理技術理解的一些總結。不對之處,請指正。為什麼我們需要會話管理眾所周知,HTTP協議是一個無狀態的協議,也就是說每個請求都是一個獨立

轉載 CSDN 談談證券公司一些部門的理解(前、、後臺)

價格 限制 跳槽 創業 角度 諸多 增加 正常 挖掘 談談我對證券公司一些部門的理解(前、中、後臺) 2018年02月08日 15:11:07 unirong 閱讀數:2165 文中對各大部門的分析都是從作者多年經歷總結出來

談談Android View事件分發的理解

event 調用 ack 處理 group ans import ras 運行 寫這篇博客的緣由。近期因為項目中用到相似一個LinearLayout中水平布局中,有一個TextView和Button,然後對該LinearLayout布局設置點擊事件。點擊

談談Docker的簡單理解

linux 安全性 看到了 用戶 總結 們的 部分 占用 ont Docker能解決什麽問題呢?一個工具的出現必然需要解決一些問題,Docker也不例外,簡單說說我們常見的2種情況Docker是如何解決的吧。1、程序在我這跑得好好的,在你那怎麽就不行呢?!這是一個典型的應用

談談Spring IOC的理解

反轉 頻率 註解 改變 enc encoding 圖1 1.3 ram 轉自京東開濤大神的微博,這是我看過最好的對IOC DI的解釋. 學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴註入)這兩個概念,對於初學Spring的人來說,總