1.什么是面向?qū)ο螅?/h4>
面向?qū)ο缶幊蹋∣bject Oriented Programming, OOP, 面向?qū)ο蟪绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程架構(gòu)咬腕,OOP的一條基本原則是計(jì)算機(jī)程序是由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成憨闰,OOP達(dá)到了軟件工程的三 個(gè)目標(biāo):重用性舟茶、靈活性和擴(kuò)展性信卡。為了實(shí)現(xiàn)整體運(yùn)算,每個(gè)對(duì)象都能夠接收信息执桌、處理數(shù)據(jù)和向其它對(duì)象發(fā)送信息家厌。面向?qū)ο笠恢笔擒浖_發(fā)領(lǐng)域內(nèi)比較熱門的話 題,首先褐奥,面向?qū)ο蠓先祟惪创挛锏囊话阋?guī)律咖耘。其次,采用面向?qū)ο蠓椒梢允瓜到y(tǒng)各部分各司其職撬码、各盡所能儿倒。為編程人員敞開了一扇大門,使其編程的代碼 更簡(jiǎn)潔呜笑、更易于維護(hù)夫否,并且具有更強(qiáng)的可重用性。有人說PHP不是一個(gè)真正的面向?qū)ο蟮恼Z言叫胁,這是事實(shí)凰慈。PHP 是一個(gè)混合型語言,你可以使用OOP驼鹅,也可以使用傳統(tǒng)的過程化編程微谓。然而森篷,對(duì)于大型項(xiàng)目,你可能需要在PHP 中使用純的OOP去聲明類堰酿,而且在你的項(xiàng)目里只用對(duì)象和類疾宏。
2.什么是類,什么是對(duì)象触创,類和對(duì)象之間的關(guān)系
類的概念:類是具有相同屬性和服務(wù)的一組對(duì)象的集合坎藐。它為屬于該類的所有對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和服務(wù)兩個(gè)主要部分哼绑。在面向?qū)ο蟮木幊陶Z言中岩馍,類是一個(gè)獨(dú)立的程序單位,它應(yīng)該有一個(gè)類名并包括屬性說明和服務(wù)說明兩個(gè)主要部分抖韩。
對(duì)象的概念:對(duì)象是系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體蛀恩,它是構(gòu)成系統(tǒng)的一個(gè)基本單位。一個(gè)對(duì)象由一組屬性和對(duì)這組屬性進(jìn)行操作的一組服務(wù)組成茂浮。從更抽象 的角度來說双谆,對(duì)象是問題域或?qū)崿F(xiàn)域中某些事物的一個(gè)抽象,它反映該事物在系統(tǒng)中需要保存的信息和發(fā)揮的作用席揽;它是一組屬性和有權(quán)對(duì)這些屬性進(jìn)行操作的一組 服務(wù)的封裝體顽馋。客觀世界是由對(duì)象和對(duì)象之間的聯(lián)系組成的幌羞。
類與對(duì)象的關(guān)系就如模具和鑄件的關(guān)系寸谜,類的實(shí)例化結(jié)果就是對(duì)象,而對(duì)一類對(duì)象的抽象就是類.類描述了一組有相同特性(屬性)和相同行為(方法)的對(duì)象属桦。 不要被概念的東西搞暈了
舉個(gè)例子:
如果你去中關(guān)村想買幾臺(tái)組裝的PC機(jī)熊痴,到了那里你第一步要干什么, 是不是裝機(jī)的工程師和你坐在一起聂宾,按你提供的信息和你一起完成一個(gè)裝機(jī)的配置單呀果善, 這個(gè)配置單就可以想像成是類,它就是一張紙系谐,但是它上面記錄了你要買的PC機(jī)的信息岭埠,如果用這個(gè)配置單買10臺(tái)機(jī)器,那么這10臺(tái)機(jī)子蔚鸥,都是按這個(gè)配置單 組成的,所以說這10臺(tái)機(jī)子是一個(gè)類型的许赃,也可以說是一類的止喷。那么什么是對(duì)象呢,類的實(shí)例化結(jié)果就是對(duì)象, 用這個(gè)配置單配置出來(實(shí)例化出來)的機(jī)子就是對(duì)象混聊, 是我們可以操作的實(shí)體弹谁, 10臺(tái)機(jī)子, 10個(gè)對(duì)象。 每臺(tái)機(jī)子都是獨(dú)立的预愤,只能說明他們是同一類的沟于,對(duì)其中一個(gè)機(jī)做任何動(dòng)作都不會(huì)影響其它9臺(tái)機(jī)器,但是我對(duì)類修改植康, 也就是在這個(gè)配置單上加一個(gè)或少一個(gè)配件旷太, 那么裝出來的9個(gè)機(jī)子都改變了, 這是類和對(duì)象的關(guān)系(類的實(shí)例化結(jié)果就是對(duì)象)
3.如何抽象出一個(gè)類销睁?
類是對(duì)象的抽象組織供璧,對(duì)象是類的具體存在。所以要定義規(guī)范冻记、合理的類結(jié)構(gòu)首先應(yīng)該明確類應(yīng)該具有的屬性和方法睡毒,在初學(xué)階段可以將類理解為屬性+方法的集合體,一個(gè)類可以包含有屬于自己的常量冗栗,變量(稱為“屬性”)以及函數(shù)(稱為“方法”)演顾。
只要掌握基本的程序語法定義規(guī)則就可以做的出來,那么難點(diǎn)在那里呢隅居? 一個(gè)項(xiàng)目要用到多少個(gè)類钠至,用多少個(gè)對(duì)象, 在哪要定義類军浆,定義一個(gè)什么樣的類棕洋,這個(gè)類實(shí)例化出多少個(gè)對(duì)象, 類里面有多少個(gè)屬性乒融, 有多少個(gè)方法等等掰盘,這就需要大家通過在實(shí)際的開發(fā)中就實(shí)際問題分析設(shè)計(jì)和總結(jié)了。 類的定義:
calss 類名 {
}
使用一個(gè)關(guān)鍵字class和后面加上一個(gè)你想要的類名以及加上一對(duì)大括號(hào)赞季, 這樣一個(gè)類的結(jié)構(gòu)就定義出來了愧捕,只要在里面寫代碼就可以了。
屬性:
通過在類定義中使用關(guān)鍵字" var "來聲明變量申钩,即創(chuàng)建了類的屬性次绘,雖然在聲明成員屬性的時(shí)候可以給定初值, 但是在聲明類的時(shí)候給成員屬性初始值是沒有必要的撒遣,我們?cè)趯?shí)例出對(duì)象后給成員屬性初始值就可以了邮偎。
方法:
通過在類定義中聲明函數(shù),即創(chuàng)建了類的方法义黎。
舉個(gè)例子:
class Person {
// 下面是人的成員屬性
var $name; // 人的名字
var $sex; // 人的性別
var $age; // 人的年齡
// 下面是人的成員方法
function say() { // 這個(gè)人可以說話的方法
echo "這個(gè)人在說話";
}
function run() { //這個(gè)人可以走路的方法
echo "這個(gè)人在走路";
}
}
4.如何實(shí)例化對(duì)象禾进?
我們上面說過面向?qū)ο蟪绦虻膯挝痪褪菍?duì)象,但對(duì)象又是通過類的實(shí)例化出來的廉涕,既然我們類會(huì)聲明了泻云,下一步就是實(shí)例化對(duì)象了艇拍。
當(dāng)定義好類后,我們使用new關(guān)鍵字來生成一個(gè)對(duì)象宠纯。
class Person {
// 下面是人的成員屬性
var $name; // 人的名字
var $sex; // 人的性別
var $age; // 人的年齡
// 下面是人的成員方法
function say() { // 這個(gè)人可以說話的方法
echo "這個(gè)人在說話";
}
function run() { //這個(gè)人可以走路的方法
echo "這個(gè)人在走路";
}
}
$p1 = new Person();
$p2 = new Person();
$p3 = new Person();
$p1就是我們實(shí)例出來的對(duì)象名稱卸夕, 同理,$p2, $p3也是我們實(shí)例出來的對(duì)象名稱婆瓜,一個(gè)類可以實(shí)例出多個(gè)對(duì)象快集,每個(gè)對(duì)象都是獨(dú)立的,上面的代碼相當(dāng)于實(shí)例出來3個(gè)人來勃救, 每個(gè)人之間是沒有聯(lián)系的碍讨, 只能說明他們都是人類, 每個(gè)人都有自己的姓名蒙秒, 性別和年齡的屬性勃黍,每個(gè)人都有說話和走路的方法,只要是類里面體現(xiàn)出來的成員屬性和成員方法晕讲,實(shí)例化出來的對(duì)象里面就包含了這些屬性和方法覆获。
對(duì)像在PHP里面和整型、浮點(diǎn)型一樣瓢省,也是一種數(shù)據(jù)類弄息,都是存儲(chǔ)不同類型數(shù)據(jù)用的,在運(yùn)行的時(shí)候都要加載到內(nèi)存中去用勤婚, 那么對(duì)象在內(nèi)存里面是怎么體現(xiàn)的呢摹量??jī)?nèi)存從羅輯上說大體上是分為4段, 椔ǎ空間段缨称, 堆空間段,代碼段祝迂, 初使化靜態(tài)段睦尽, 程序里面不同的聲明放在不同的內(nèi)存段里面,椥亡ǎ空間段是存儲(chǔ)占用相同空間長(zhǎng)度并且占用空間小的數(shù)據(jù)類型的地方当凡,比如說整型1, 10纠俭, 100沿量, 1000, 10000冤荆, 100000等等朴则,在內(nèi)存里面占用空間是等長(zhǎng)的,都是64位4個(gè)字節(jié)匙赞。 那么數(shù)據(jù)長(zhǎng)度不定長(zhǎng)佛掖,而且占有空間很大的數(shù)據(jù)類型的數(shù)據(jù)放在那內(nèi)存的那個(gè)段里面呢?這樣的數(shù)據(jù)是放在堆內(nèi)存里面的涌庭。棧內(nèi)存是可以直接存取的芥被,而堆內(nèi)存是不 可以直接存取的內(nèi)存。對(duì)于我們的對(duì)象來說就是一種大的數(shù)據(jù)類型而且是占用空間不定長(zhǎng)的類型坐榆,所以說對(duì)象是放在堆里面的拴魄,但對(duì)象名稱是放在棧里面的,這樣通 過對(duì)象名稱就可以使用對(duì)象了席镀。
5.如何使用對(duì)象中的成員
訪問對(duì)象中的成員就要使用一個(gè)特殊的操作符”->”來完成對(duì)象成員的訪問:
class Person {
// 下面是人的成員屬性
var $name; // 人的名子
var $sex; // 人的性別
var $age; // 人的年齡
// 下面是人的成員方法
function say() { // 這個(gè)人可以說話的方法
echo "這個(gè)人在說話";
}
function run() { // 這個(gè)人可以走路的方法
echo "這個(gè)人在走路";
}
}
$p1 = new Person(); // 創(chuàng)建實(shí)例對(duì)象$p1
$p2 = new Person(); // 創(chuàng)建實(shí)例對(duì)象$p2
$p3 = new Person(); // 創(chuàng)建實(shí)例對(duì)象$p3
// 下面三行是給$p1對(duì)象屬性賦值
$p1->name = "張三";
$p1->sex = "男";
$p1->age = 20;
// 下面三行是訪問$p1對(duì)象的屬性
echo "p1對(duì)象的名子是:" . $p1->name;
echo "p1對(duì)象的性別是:" . $p1->sex;
echo "p1對(duì)象的年齡是:" . $p1->age;
// 下面兩行訪問$p1對(duì)象中的方法
$p1->say();
$p1->run();
// 下面三行是給$p2對(duì)象屬性賦值
$p2->name = "李四";
$p2->sex = "女";
$p2->age = 30;
// 下面三行是訪問$p2對(duì)象的屬性
echo "p2對(duì)象的名子是:" . $p2->name;
echo "p2對(duì)象的性別是:" . $p2->sex;
echo "p2對(duì)象的年齡是:" . $p2->age;
// 下面兩行訪問$p2對(duì)象中的方法
$p2->say();
$p2->run();
// 下面三行是給$p3對(duì)象屬性賦值
$p3->name="王五";
$p3->sex="男";
$p3->age=40;
// 下面三行是訪問$p3對(duì)象的屬性
echo "p3對(duì)象的名子是:" . $p3->name;
echo "p3對(duì)象的性別是:" . $p3->sex;
echo "p3對(duì)象的年齡是:" . $p3->age;
// 下面兩行訪問$p3對(duì)象中的方法
$p3->say();
$p3->run();
從上例中可以看出只是對(duì)象里面的成員就要使用對(duì)象->屬性 匹中、對(duì)象->方法 形式訪問。