面向对象知识点
面向?qū)ο缶幊?/p>
第 1 章?????????? 類(lèi)與對(duì)象................................................................................................................ 1
1.1???????????????? 學(xué)習(xí)技術(shù)的套路??????????????????????????????????????????????????????????????????????????????????????????????????????? 1
1.2???????????????? 看一個(gè)實(shí)際的需求??????????????????????????????????????????????????????????????????????????????????????????????????? 1
1.3???????????????? php支持面向?qū)ο????????????????????????????????????????????????????????????????????????????????????????????????????? 3
1.4???????????????? 類(lèi)與對(duì)象的關(guān)系??????????????????????????????????????????????????????????????????????????????????????????????????????? 4
1.5???????????????? 如果理解類(lèi)與對(duì)象??????????????????????????????????????????????????????????????????????????????????????????????????? 6
1.6???????????????? 類(lèi)的定義????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 6
1.7???????????????? 成員屬性????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 6
1.8???????????????? 創(chuàng)建對(duì)象的說(shuō)明??????????????????????????????????????????????????????????????????????????????????????????????????????? 7
1.9???????????????? 對(duì)象傳遞方式(重點(diǎn), 難點(diǎn))???????????????????????????????????????????????????????????????????????????????????????? 9
1.10?????????????? 成員方法(函數(shù))?????????????????????????????????????????????????????????????????????????????????????????????????????? 10
第 2 章?????????? 構(gòu)造方法(函數(shù))..................................................................................................... 14
2.1???????????????? 一個(gè)需求,引出構(gòu)造函數(shù)??????????????????????????????????????????????????????????????????????????????????????? 14
2.2???????????????? 構(gòu)造函數(shù)的基本介紹?????????????????????????????????????????????????????????????????????????????????????????????? 14
2.3???????????????? 快速入門(mén)案例????????????????????????????????????????????????????????????????????????????????????????????????????????? 14
2.4???????????????? 構(gòu)造函數(shù)的細(xì)節(jié)和注意事項(xiàng)???????????????????????????????????????????????????????????????????????????????????? 15
2.5???????????????? 默認(rèn)構(gòu)造函數(shù)????????????????????????????????????????????????????????????????????????????????????????????????????????? 16
2.6???????????????? 構(gòu)造函數(shù)的小結(jié)????????????????????????????????????????????????????????????????????????????????????????????????????? 18
2.7???????????????? 類(lèi)定義的進(jìn)一步完善?????????????????????????????????????????????????????????????????????????????????????????????? 18
第 3 章?????????? 析構(gòu)函數(shù)............................................................................................................... 20
3.1???????????????? 簡(jiǎn)單的介紹???????????????????????????????????????????????????????????????????????????????????????????????????????????? 20
3.2???????????????? php文件執(zhí)行的流程???????????????????????????????????????????????????????????????????????????????????????????????? 20
3.3???????????????? 析構(gòu)函數(shù)的基本使用?????????????????????????????????????????????????????????????????????????????????????????????? 21
3.4???????????????? 析構(gòu)函數(shù)的小結(jié)????????????????????????????????????????????????????????????????????????????????????????????????????? 22
3.5???????????????? 析構(gòu)函數(shù)的最佳實(shí)踐?????????????????????????????????????????????????????????????????????????????????????????????? 22
3.6???????????????? 垃圾回收機(jī)制????????????????????????????????????????????????????????????????????????????????????????????????????????? 24
3.7???????????????? 類(lèi)定義的完善????????????????????????????????????????????????????????????????????????????????????????????????????????? 25
?
?
第 1 章 類(lèi)與對(duì)象
1.1 學(xué)習(xí)技術(shù)的套路
1.2 看一個(gè)實(shí)際的需求
?
?
1.3 php支持面向?qū)ο?/span>
?
職業(yè)規(guī)劃:
PHP + 前端技術(shù) ===> 全棧工程師
架構(gòu)師
python(對(duì)項(xiàng)目架構(gòu)和運(yùn)維[負(fù)載,讀寫(xiě)分離,優(yōu)化等等 ,大流量,大并發(fā),大數(shù)據(jù)]) + linux(centos/ubuntu) + unix(freebsd, solars) + 算法
cto => 首先技術(shù)官
ceo => 首先執(zhí)行官
1.4 類(lèi)與對(duì)象的關(guān)系
在面向?qū)ο缶幊讨?#xff0c;最重要的概念就是 類(lèi) 和對(duì)象,因此我們必須將他們的關(guān)系和區(qū)別搞清楚.
舉例說(shuō)明:
說(shuō)明: 從上面的代碼我們可以看出
1.5 如果理解類(lèi)與對(duì)象
1.6 類(lèi)的定義
class? 類(lèi)名{
????? 訪問(wèn)修飾符 成員屬性1;
?? 訪問(wèn)修飾符 成員屬性2;
????? //.....
}
1.7 成員屬性
類(lèi)的變量成員叫做“屬性”,或者叫“字段”、“特征”,在本文檔統(tǒng)一稱(chēng)為“屬性”。屬性聲明是由關(guān)鍵字 public,protected 或者 private 開(kāi)頭,然后跟一個(gè)普通的變量聲明來(lái)組成。屬性中的變量可以初始化,但是初始化的值必須是常數(shù),這里的常數(shù)是指 PHP 腳本在編譯階段時(shí)就可以得到其值,而不依賴(lài)于運(yùn)行時(shí)的信息才能求值。
成員屬性是類(lèi)的一個(gè)組成部分,一般是基本數(shù)據(jù)類(lèi)型(整數(shù),字符串等),
也可是復(fù)合類(lèi)型(對(duì)象、數(shù)組) , 資源類(lèi)型。比如我們前面定義貓類(lèi)的
public $age 就是成員屬性。
?
1.8 創(chuàng)建對(duì)象的說(shuō)明
說(shuō)明
$對(duì)象名? =? new 類(lèi)名()
$對(duì)象名? =? new 類(lèi)名
等價(jià)
舉例:
類(lèi)名不區(qū)分大小寫(xiě).
類(lèi)名命名規(guī)范
關(guān)于函數(shù),變量,常量,接口等等的命名規(guī)范,請(qǐng)參考手冊(cè).
?
1.9 對(duì)象傳遞方式(重點(diǎn), 難點(diǎn))
?
?
注意當(dāng) 對(duì)象傳遞方式是 $p1 = $p2 , 分析如上圖
?
注意當(dāng) 對(duì)象傳遞方式是 $p1 = &$p2 , 分析如上圖
?
1.10成員方法(函數(shù))
當(dāng)我們需要讓對(duì)象完成某個(gè)任務(wù)(比如計(jì)算,比如上傳下載文件,分頁(yè)等等), 就需要在類(lèi)中定義函數(shù), 這時(shí)我們就將這樣的函數(shù)稱(chēng)為 成員方法.
?
代碼走:
?
原理分析圖如下:
?
class? 類(lèi)名{
????? 成員屬性;
訪問(wèn)修飾符? function? 成員方法1名(形參){
??? 方法體;
???? ??return 語(yǔ)句;//[是有程序員自己決定的,]
}
訪問(wèn)修飾符? function? 成員方法1名(形參){
??? 方法體;
return 語(yǔ)句;//
}
?
}
?
說(shuō)明
?
第 2 章 構(gòu)造方法(函數(shù))
2.1 一個(gè)需求,引出構(gòu)造函數(shù)
什么是構(gòu)造函數(shù)呢?在回答這個(gè)問(wèn)題之前,我們來(lái)看一個(gè)需求:前面我們?cè)趧?chuàng)建人類(lèi)的對(duì)象時(shí),是先把一個(gè)對(duì)象創(chuàng)建好后,再給他的年齡和姓名屬性賦值,如果現(xiàn)在我要求,在創(chuàng)建人類(lèi)的對(duì)象時(shí),就指定這個(gè)對(duì)象的年齡和姓名,該怎么做?
2.2 構(gòu)造函數(shù)的基本介紹
class? 類(lèi)名{
????? //構(gòu)造函數(shù)
????? 訪問(wèn)修飾符 function? __construct(形參列表){
?????? //可以對(duì)成員屬性進(jìn)行初始化.
}
}
??? ?????? 說(shuō)明
2.3 快速入門(mén)案例
走代碼:(基本的使用案例)
2.4 構(gòu)造函數(shù)的細(xì)節(jié)和注意事項(xiàng)
2.5 默認(rèn)構(gòu)造函數(shù)
說(shuō)明: 通過(guò)上面的案例,我們講解了兩個(gè)重要的點(diǎn)
this這個(gè)關(guān)鍵字,只能在類(lèi)的方法中使用,而不能在類(lèi)的外部使用.
2.6 構(gòu)造函數(shù)的小結(jié)
2.7 類(lèi)定義的進(jìn)一步完善
?
第 3 章 析構(gòu)函數(shù)
3.1 簡(jiǎn)單的介紹
基本的說(shuō)明: 文檔的說(shuō)明:
PHP 5 引入了析構(gòu)函數(shù)的概念,這類(lèi)似于其它面向?qū)ο蟮恼Z(yǔ)言,如 C++。析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷(xiāo)毀時(shí)執(zhí)行
我們來(lái)理解一下上面的話
上面寫(xiě)的三種方式,都是顯示銷(xiāo)毀, 所謂顯示銷(xiāo)毀就是程序員主動(dòng)的刪除對(duì)象引用.
如果程序員不去顯示銷(xiāo)毀對(duì)象,那么在程序執(zhí)行完畢后,這個(gè)對(duì)象就會(huì)被系統(tǒng)銷(xiāo)毀,這個(gè)就是系統(tǒng)銷(xiāo)毀
3.2 php文件執(zhí)行的流程
畫(huà)圖:
3.3 析構(gòu)函數(shù)的基本使用
class? 類(lèi)名{
????? public? function? __destruct(){
?????? //函數(shù)體
?? //析構(gòu)函數(shù)的最重要的作用,就是釋放對(duì)象創(chuàng)建的資源
?? //比如 數(shù)據(jù)庫(kù)連接, 文件句柄, 繪圖句柄..
}
}
?
說(shuō)明
?
?
3.4 析構(gòu)函數(shù)的小結(jié)
3.5 析構(gòu)函數(shù)的最佳實(shí)踐
我們使用析構(gòu)函數(shù)完成對(duì)資源的及時(shí)釋放
說(shuō)明
3.6 垃圾回收機(jī)制
?
3.7 類(lèi)定義的完善
?
?
第 4 章 魔術(shù)方法
4.1 魔術(shù)方法一覽
說(shuō)明
4.2 訪問(wèn)控制修飾符的基本入門(mén)介紹
因?yàn)槟g(shù)方法和訪問(wèn)修飾符關(guān)系密切,因此我們需要先學(xué)習(xí)一下訪問(wèn)控制修飾符的基本知識(shí), 這里我們先講一個(gè)基本的介紹.
對(duì)屬性或方法的訪問(wèn)控制,是通過(guò)在前面添加關(guān)鍵字 public(公有),protected(受保護(hù))或 private(私有)來(lái)實(shí)現(xiàn)的。被定義為公有的類(lèi)成員可以在任何地方被訪問(wèn)。被定義為受保護(hù)的類(lèi)成員則可以被其自身以及其子類(lèi)和父類(lèi)訪問(wèn)。被定義為私有的類(lèi)成員則只能被其定義所在的類(lèi)訪問(wèn)
4.3 魔術(shù)方法之-__get 和 __set函數(shù)
需求是: 如果對(duì)象有一個(gè)成員變量是private、protectd的,我希望在在類(lèi)的外部通過(guò) : $對(duì)象名->變量名的方式來(lái)賦值和取值,怎么辦?
4.4 魔術(shù)方法之-__isset 和 __unset函數(shù)
?
| <?php ????? header('content-type:text/html;charset=utf-8'); ????? //property_exists說(shuō)明 ? ????? class A{ ????? ?????? public $name; ????? ?????? protected $food; ? ????? ?????? public function __construct($name, $food){ ????? ?????? ?????? $this->name = $name; ????? ?????? ?????? $this->food = $food; ????? ?????? } ????? } ? ????? $a = new A('小貓', '魚(yú)兒'); ????? ????? unset($a->name); ? ????? echo'<pre>'; ????? var_dump($a); ? ????? if(property_exists($a, 'name')){ ????? ?????? echo '<br> name屬性存在'; ????? } ? ????? //屬性的重載 ????? $a->age = 100; ? ????? echo '<pre>'; ????? var_dump($a); ? ????? if(property_exists($a, 'age')){ ????? ?????? echo '<br> age屬性存在'; ????? }else{ ????? ?????? echo '<br> age屬性不存在'; ????? } ? ????? unset($a->age); ????? echo '<pre>'; ????? echo '<br>---------<br>'; ????? var_dump($a); ? ????? if(property_exists($a, 'age')){ ????? ?????? echo '<br> age屬性存在'; ????? }else{ ????? ?????? echo '<br> age屬性不存在'; ????? } ? ????? //property_exists(對(duì)象名, 屬性) ????? //1. 先判斷該對(duì)象是否有這個(gè)屬性,如果有則返回真. ????? //2. 如果該對(duì)象沒(méi)有有這個(gè)屬性, 則繼續(xù)判斷該對(duì)象對(duì)應(yīng)的類(lèi)是否定義過(guò)這個(gè)屬性,如果定義過(guò)仍然返回真,否則才返回假 ? ? ? ? |
?
4.5 魔術(shù)方法之-__toString 函數(shù)
當(dāng)我們希望將一個(gè)對(duì)象當(dāng)做字符串來(lái)輸出時(shí),就會(huì)觸發(fā)__toString魔術(shù)方法.
做兩個(gè)怪物!
?
4.6 魔術(shù)方法之-__clone函數(shù)
當(dāng)我們需要將一個(gè)對(duì)象完全的賦值一份, 保證兩個(gè)對(duì)象的屬性和屬性值一樣,但是他們的數(shù)據(jù)庫(kù)空間獨(dú)立,則可以使用對(duì)象克隆。
說(shuō)明
4.7 魔術(shù)方法之-__call函數(shù)
我們就是希望,在類(lèi)的外部直接調(diào)用不可訪問(wèn)的成員方法(private , protected).
?
點(diǎn)評(píng):
?
第 5 章 類(lèi)的自動(dòng)加載
5.1 看一個(gè)需求
說(shuō)明
5.2 使用傳統(tǒng)的方法來(lái)解決
5.3 對(duì)代碼優(yōu)化,使用類(lèi)的自動(dòng)加載來(lái)完成
5.4 對(duì)代碼思考,對(duì)代碼進(jìn)行靈活性的處理
common.php 文件
5.5 使用spl_autoload_register? 的高級(jí)方式(了解)來(lái)完成類(lèi)的自動(dòng)加載
?
第 6 章 靜態(tài)屬性
6.1 看一個(gè)開(kāi)發(fā)的需求
6.2 思路(使用現(xiàn)有的技術(shù)解決)
?
6.3 對(duì)上面代碼的進(jìn)行分析和優(yōu)化
?
6.4 靜態(tài)變量的其它說(shuō)明
靜態(tài)屬性是該類(lèi)的所有對(duì)象共享的變量,任何一個(gè)該類(lèi)的對(duì)象去訪問(wèn)它時(shí),取到的都是相同的值,同樣任何一個(gè)該類(lèi)的對(duì)象去修改它時(shí),修改的也是同一個(gè)變量。這個(gè)從前面的圖也可看出來(lái).
說(shuō)明上面兩種方式是等價(jià)的.
6.5 如何訪問(wèn)靜態(tài)屬性
可以使用兩種方式? self::$靜態(tài)屬性名? ,? 類(lèi)名::$靜態(tài)屬性名
:: 叫 范圍解析符.
舉例:
如果要在類(lèi)的外部訪問(wèn)靜態(tài)屬性,靜態(tài)屬性需要是public ,否則也不能直接訪問(wèn), 訪問(wèn)的形式是 類(lèi)名::$屬性名;
6.6 靜態(tài)屬性的使用注意事項(xiàng)
6.7 課后練習(xí)題
| <?php ????? header('content-type:text/html;charset=utf-8'); ????? /* ????? 要求: ????? 請(qǐng)?jiān)O(shè)計(jì)一個(gè)Person類(lèi), (有 名字, 年齡? 和? 蛋糕 三個(gè)屬性) ????? 蛋糕一共1000塊,是所有人共享的. ????? 創(chuàng)建唐僧師徒四人,他們每人都吃蛋糕, 唐僧每天吃 3塊,悟空吃5塊,沙和尚吃9塊,豬八戒吃 30塊. (編寫(xiě)一個(gè) eat方法來(lái)吃) ????? 問(wèn)兩天后,還剩多少塊蛋糕,(編寫(xiě)一個(gè) showCake() 來(lái)顯示) ????? 請(qǐng)計(jì)算,蛋糕一共可以吃多少天. ? ????? */ ? ? ????? class Person{ ????? ?????? public $name; ????? ?????? public $age; ????? ?????? // 蛋糕一共1000塊,是所有人共享的, 因?yàn)楣蚕淼?#xff0c;因此我們應(yīng)該設(shè)為static ????? ?????? protected static $cakeNum = 1000; ? ????? ?????? //構(gòu)造函數(shù) ????? ?????? public function __construct($name, $age){ ????? ?????? ?????? $this->name = $name; ????? ?????? ?????? $this->age = $age; ????? ?????? } ? ????? ?????? //編寫(xiě)一個(gè)eat方法 ????? ?????? public function eat($num){ ? ????? ?????? ?????? //判斷一下是否夠吃 ????? ?????? ?????? if(self::$cakeNum >= $num){ ????? ?????? ?????? ?????? self::$cakeNum -= $num; ????? ?????? ?????? ?????? return true; ????? ?????? ?????? }else{ ????? ?????? ?????? ?????? ????? ?????? ?????? ?????? echo '<br> 當(dāng)' .$this->name. ' 想吃 ' . $num . ' 塊蛋糕, 不夠了,不能吃了'; ????? ?????? ?????? ?????? return false; ????? ?????? ?????? } ????? ?????? } ? ????? ?????? //編寫(xiě)一個(gè)方法,顯示還有多少塊蛋糕 ????? ?????? public function showNum(){ ????? ?????? ?????? ????? ?????? ?????? echo '<br> 當(dāng)前還有 ' . self::$cakeNum . ' 蛋糕...'; ????? ?????? } ? ????? ?????? ? ????? } ? ????? //使用 ????? //問(wèn)兩天后,還剩多少塊蛋糕,(編寫(xiě)一個(gè) showCake() 來(lái)顯示) ????? //1. 創(chuàng)建四個(gè)對(duì)象 ????? $monk = new Person('唐僧', 30); ????? $monkey = new Person('悟空', 500); ????? $pig = new Person('八戒', 400); ????? $sMonk = new Person('沙僧', 300); ? ????? //2. 統(tǒng)計(jì)兩天后 ????? $day = 20; ????? for($i = 0; $i < $day; $i++){ ????? ?????? ????? ?????? if(!$monk->eat(3)){ ????? ?????? ?????? break; ????? ?????? } ????? ?????? if(!$monkey->eat(5)){ ????? ?????? ?????? break; ????? ?????? } ????? ?????? if(!$sMonk->eat(9)){ ????? ?????? ?????? break; ????? ?????? } ????? ?????? if(!$pig->eat(30)){ ????? ?????? ?????? break; ????? ?????? } ????? } ? ????? echo '<br> 一共 可以吃 ' . ($i+1) . '天'; ? ????? /* ????? ?????? //思想?? 【程序員? 思想=====(鍛煉)=====>代碼(php技術(shù)) 】 ????? ?????? $count_day = 0; ????? ?????? while(true){ ????? ?????? ?????? ????? ?????? ?????? if(!$monk->eat(3)){ ????? ?????? ?????? break; ????? ?????? ?????? } ????? ?????? ?????? if(!$monkey->eat(5)){ ????? ?????? ?????? ?????? break; ????? ?????? ?????? } ????? ?????? ?????? if(!$sMonk->eat(9)){ ????? ?????? ?????? ?????? break; ????? ?????? ?????? } ????? ?????? ?????? if(!$pig->eat(30)){ ????? ?????? ?????? ?????? break; ????? ?????? ?????? } ? ????? ?????? ?????? $count_day++; ????? ?????? } ? ????? */ ? ????? //3. 看看還剩多少塊 ? ?????? $monk->showNum(); |
?
?
?
第 7 章 靜態(tài)方法
7.1 基本的介紹
當(dāng)程序員需要對(duì)靜態(tài)屬性進(jìn)行操作時(shí),可以定義靜態(tài)方法來(lái)處理, 靜態(tài)方法是專(zhuān)門(mén)用于操作靜態(tài)屬性.
class 類(lèi){
????? 訪問(wèn)修飾符? static? function 函數(shù)名(形參){
?????? //函數(shù)體
}
}
??? ?????? 說(shuō)明
7.2 靜態(tài)方法的細(xì)節(jié)討論
舉例說(shuō)明:
舉例說(shuō)明:
舉例:
?
7.3 靜態(tài)屬性和靜態(tài)方法的最佳實(shí)踐-單例模式
?
第一種版本-ok
?
?
第 8 章 OOP編程的三大特征-封裝
8.1 基本介紹
oop編程的三大特征是: 封裝性, 繼承, 多態(tài). 說(shuō)明一下,在php面向?qū)ο缶幊讨?#xff0c;多態(tài)提的并不是很多,因?yàn)閜hp本身就是天生的多態(tài).
8.2 抽象
在面向?qū)ο缶幊讨?#xff0c;將一類(lèi)事物的共有的屬性(成員屬性)和行為(成員方法)提取出來(lái),形成一個(gè)模板(類(lèi)), 這種解決問(wèn)題的方法就是抽象.
8.3 抽象的實(shí)際案例
代碼說(shuō)明:
8.4 封裝的基本概念
8.5 封裝的具體實(shí)現(xiàn)-訪問(wèn)控制符
總結(jié):
public?? ?????? 類(lèi)內(nèi)部、外部和子類(lèi)都可以訪問(wèn);
protected?? 表示受保護(hù)的,只有本類(lèi)或子類(lèi)可以訪問(wèn);
private??????? 表示私有的,只有本類(lèi)內(nèi)部可以使用;
強(qiáng)調(diào): 上面的說(shuō)的訪問(wèn)控制訪問(wèn),對(duì)屬性和成員方法都起作用.
8.6 如何訪問(wèn)protected和private屬性的三種形式
總結(jié)
舉例說(shuō)明:
說(shuō)明
舉例說(shuō)明:
| <?php ????? header('content-type:text/html;charset=utf-8'); ? ????? //Movie(名稱(chēng),導(dǎo)演,成本(protected),票房[ticket_office](private)) ????? //updateInfo() showAllInfo() ? ????? class Movie{ ????? ?????? public $name; ????? ?????? public $director; ????? ?????? protected $cost; ????? ?????? private $ticketOffice; ? ????? ?????? public function __construct($name, $director, $cost){ ????? ?????? ?????? $this->name = $name; ????? ?????? ?????? $this->director = $director; ????? ?????? ?????? $this->cost = $cost; ????? ?????? } ? ????? ?????? //顯示一下電影信息 ????? ?????? public function showAllInfo(){ ????? ?????? ?????? echo '<br> 電影的信息如下:'; ????? ?????? ?????? echo '<br> name = ' . $this->name; ????? ?????? ?????? echo '<br> director = ' . $this->director; ????? ?????? ?????? echo '<br> cost = ' . $this->cost; ????? ?????? ?????? echo '<br> tickeoffice = ' . $this->ticketOffice; ????? ?????? } ? ????? ?????? ? ????? ?????? public function updateInfo($director, $cost, $ticketOffice){ ????? ?????? ?????? ????? ?????? ?????? //簡(jiǎn)單方式 //??? ?????? ?????? $this->director = $director; //??? ?????? ?????? $this->cost = $cost; //??? ?????? ?????? $this->ticketOffice = $ticketOffice; ? ????? ?????? ?????? //結(jié)合setXxx 來(lái)完成 ????? ?????? ?????? $this->setDirector($director); ????? ?????? ?????? $this->setCost($cost); ????? ?????? ?????? $this->setTicketOffice($ticketOffice); ????? ?????? ?????? ????? ?????? } ? ????? ?????? //setXxx GetXxx ????? ?????? ????? ?????? public function SetDirector($director){ ????? ?????? ?????? $this->director = $director; ????? ?????? } ????? ?????? ????? ?????? public function getDirector(){ ????? ?????? ?????? return $this->director; ????? ?????? } ? ????? ?????? public function setCost($cost){ ????? ?????? ?????? ????? ?????? ?????? //加入數(shù)據(jù)的驗(yàn)證和判斷 ????? ?????? ?????? if(is_numeric($cost) && $cost > 0.0){ ????? ?????? ?????? ?????? $this->cost = $cost; ????? ?????? ?????? }else{ ????? ?????? ?????? ?????? echo '<br> 輸入成本格式有問(wèn)題 '; ????? ?????? ?????? } ????? ?????? } ? ????? ?????? public function getCost(){ ????? ?????? ?????? return $this->cost; ????? ?????? } ? ????? ?????? public function setTicketOffice($ticketOffice){ ????? ?????? ?????? ????? ?????? ?????? //加入數(shù)據(jù)的驗(yàn)證和判斷 ????? ?????? ?????? if(is_numeric($ticketOffice) && $ticketOffice > 0.0){ ????? ?????? ?????? ?????? $this->ticketOffice = $ticketOffice; ????? ?????? ?????? }else{ ????? ?????? ?????? ?????? echo '<br> 輸入票房格式有問(wèn)題 '; ????? ?????? ?????? } ????? ?????? } ? ????? ?????? public function getTicketOffice(){ ????? ?????? ?????? return $this->ticketOffice; ????? ?????? } ? ????? } ? ????? $movie = new Movie('葫蘆娃', '老爺子', 60000); ? ????? $movie->showAllInfo(); ? ????? echo '<br>***********<br>'; ????? $movie->updateInfo('老韓', 4000, 89000); ? ?????? $movie->showAllInfo(); |
8.7 在開(kāi)發(fā)中,如何選擇操作方式
8.8 封裝的細(xì)節(jié)說(shuō)明
舉例說(shuō)明:
?
8.9 對(duì)象運(yùn)算符的連用現(xiàn)象
要求是 : 通過(guò)一個(gè)學(xué)生對(duì)象,可以訪問(wèn)到該學(xué)生所在班級(jí)的信息.
代碼實(shí)現(xiàn):
對(duì)應(yīng)的原理分析圖:
8.10課后練習(xí)題
//評(píng)講....
| <?php ????? header('content-type:text/html;charset=utf-8'); ????? /* ????? ?????? ????? ?????? 要求: ????? 編寫(xiě)一個(gè)Dog類(lèi)(名字,年齡,性別,主人) ????? 編寫(xiě)一個(gè)Master類(lèi)(名字,年齡,寵物狗) ????? 創(chuàng)建一個(gè)Dog對(duì)象和Master對(duì)象,通過(guò)Dog對(duì)象可以找到對(duì)應(yīng)主人的信息,通過(guò)Master對(duì)象可以找到對(duì)應(yīng)寵物狗的信息[提示,需要各寫(xiě)一個(gè)方法.] ????? ????? */ ? ????? class Dog{ ????? ?????? ????? ?????? public $name; ????? ?????? private $age; ????? ?????? private $sex; ????? ?????? private $master; ????? ?????? public function __construct($name, $age, $sex, $master){ ????? ?????? ?????? $this->name = $name; ????? ?????? ?????? $this->age = $age; ????? ?????? ?????? $this->sex = $sex; ????? ?????? ?????? $this->master = $master; ????? ?????? } ? ????? ?????? public function setMaster($master){ ????? ?????? ?????? ????? ?????? ?????? $this->master = $master; ????? ?????? } ? ????? ?????? public function getMaster(){ ????? ?????? ?????? ????? ?????? ?????? return $this->master; ????? ?????? } ? ????? ?????? public function showMasterInfo(){ ????? ?????? ?????? ????? ?????? ?????? echo '<br> 主人的信息是'; ????? ?????? ?????? echo '<br> 主人名字是 ' . $this->master->name; ????? ?????? ?????? echo '<br> 主人年齡是 ' . $this->master->getAge(); ????? ?????? } ????? ?????? ????? } ? ? ????? class Master{ ????? ?????? ????? ?????? public $name; ????? ?????? private $age; ????? ?????? private $dog; ? ????? ?????? public function __construct($name, $age, $dog){ ????? ?????? ?????? $this->name = $name; ????? ?????? ?????? $this->age = $age; ????? ?????? ?????? $this->dog = $dog; ????? ?????? } ? ????? ?????? public function setDog($dog){ ????? ?????? ?????? $this->dog = $dog; ????? ?????? } ? ????? ?????? public function getDog($master){ ????? ?????? ????? ?????? ?????? return $this->master; ????? ?????? } ? ????? ?????? public function setAge($age){ ????? ?????? ?????? $this->age = $age; ????? ?????? } ? ????? ?????? public function getAge(){ ????? ?????? ????? ?????? ?????? return $this->age; ????? ?????? } ????? } ? ????? //創(chuàng)建一只狗 ????? $dog = new Dog('狼牙', 3, 'boy', null); ? ????? //創(chuàng)建一個(gè)人 ????? $master = new Master('老吳', 32, $dog); ? ????? echo '<pre>'; ????? var_dump($master); ? ????? $dog->setMaster($master); ????? var_dump($dog); ? ????? //顯示主人的信息 ?????? $dog->showMasterInfo(); |
?
?
?
?
?
?
?
?
?
?
第 9 章 OOP編程的三大特征-繼承
9.1 看一個(gè)實(shí)際的需求(問(wèn)題)
開(kāi)發(fā)一個(gè)學(xué)生考試系統(tǒng),學(xué)生可以考試并且測(cè)評(píng)分?jǐn)?shù),并顯示考了多少分.(小學(xué)生,大學(xué)生.)
代碼:
分析問(wèn)題
9.2 繼承的基本思想是
9.3 使用繼承的方式對(duì)上面的代碼進(jìn)行改寫(xiě)
1
9.4 繼承的概念在說(shuō)明
說(shuō)明
9.5 繼承的細(xì)節(jié)
舉例:
說(shuō)明結(jié)論
- 子類(lèi) 可以訪問(wèn) 父類(lèi)的 public 屬性和方法 (不管是子類(lèi)的內(nèi)部,還是外部)
- 子類(lèi)可以訪問(wèn)父類(lèi)的protected 的屬性和方法,但是必須在子類(lèi)的內(nèi)部才可以訪問(wèn).
- 子類(lèi)不能訪問(wèn)父類(lèi)的private 的屬性和方法
- 在輸出子類(lèi)對(duì)象時(shí),我們dump 可以看到父類(lèi)的私有屬性,但是這個(gè)私有屬性是輸入父類(lèi),在子類(lèi)中仍然無(wú)法訪問(wèn)
我們?cè)诶斫饫^承的時(shí)候,應(yīng)該這樣理解:
- 不能理解成 子類(lèi)把父類(lèi)的屬性和方法拷貝了一份
- 而是 子類(lèi)和父類(lèi)之間連接了一種查找的關(guān)系.
看一個(gè)示意圖
??? ??????
代碼說(shuō)明:
以Book 類(lèi) 繼承了 Goods 為例進(jìn)行說(shuō)明
9.6 繼承的注意事項(xiàng)
舉例:
案例看前面的即可.
9.7 類(lèi)定義的進(jìn)一步完善
9.8 繼承的課后練習(xí)題
9.9 方法重載
PHP所提供的"重載"(overloading)是指動(dòng)態(tài)地"創(chuàng)建"類(lèi)屬性和方法。我們是通過(guò)魔術(shù)方法(magic methods)__call _callStatic來(lái)實(shí)現(xiàn)的
9.10傳統(tǒng)的oop編程中,方法的重載指的是什么含義
在oop中,可以調(diào)用相同的函數(shù)名, 實(shí)現(xiàn)調(diào)用不同函數(shù)的結(jié)果,比如$obj->getSum($n1), $obj->getSum($n1, $2); 依靠函數(shù)不同的參數(shù)個(gè)數(shù)或者類(lèi)型來(lái)區(qū)分不同函數(shù).
舉例:
在php中,不能像上面這樣實(shí)現(xiàn)方法的重載.
9.11在php也可以實(shí)現(xiàn)方法重載,但是方式有變化(__call)
看出(1) 方法重載不推薦使用, 但是有些項(xiàng)目中也有使用 (2) 面試筆試有人問(wèn)你.
9.12課堂練習(xí)
?
9.13魔術(shù)方法__callStatic 說(shuō)一下
當(dāng)我們調(diào)用一個(gè)不可以訪問(wèn)(protected/private/不存在)的靜態(tài)方法時(shí),__callStatic魔術(shù)方法就會(huì)被系統(tǒng)調(diào)用。
舉例說(shuō)明:
9.14課后練習(xí)題
9.15屬性的重載
當(dāng)我們?nèi)ソo一個(gè)不存在的屬性賦值時(shí),類(lèi)會(huì)自動(dòng)的動(dòng)態(tài)的創(chuàng)建一個(gè)對(duì)應(yīng)的屬性,這個(gè)屬性是public 的.
案例:
9.16方法的重寫(xiě)
小結(jié)
9.17方法重寫(xiě)的細(xì)節(jié)說(shuō)明
?
9.18屬性的重寫(xiě)
9.19重寫(xiě)的課堂練習(xí)
?
9.20補(bǔ)充一個(gè)知識(shí)點(diǎn)類(lèi)型約束
PHP 5 可以使用類(lèi)型約束。函數(shù)的參數(shù)可以指定必須為對(duì)象(在函數(shù)原型里面指定類(lèi)的名字),接口,數(shù)組(PHP 5.1 起)或者 callable(PHP 5.4 起)。不過(guò)如果使用 NULL作為參數(shù)的默認(rèn)值,那么在調(diào)用函數(shù)的時(shí)候依然可以使用 NULL 作為實(shí)參。
舉例說(shuō)明一把:
?
第 10 章 多態(tài)[了解]
10.1基本介紹
所謂多態(tài),就是在面向?qū)ο缶幊讨?#xff0c;一個(gè)對(duì)象在不同的情況下的多種狀態(tài), 根據(jù)不同的上下文環(huán)境來(lái)決定。
10.2舉例說(shuō)明
使用代碼來(lái)完成上面的示意圖:
10.3多態(tài)的課后練習(xí)題
晚上完成即可.
?
第 11 章 抽象類(lèi)
11.1看一個(gè)開(kāi)發(fā)的實(shí)際需求
當(dāng)我們編寫(xiě)一個(gè)父類(lèi), 有個(gè)方法是不確定的,比如
class Animal {
????? public $name;
????? public function cry(){
?????? echo '<br> 動(dòng)物不知道怎么叫喚...';
}
}
cry 這里是不確定,寫(xiě)了也是白寫(xiě), 沒(méi)有意義,因此, oop中,可以將這樣的方法做成抽象方法,類(lèi)就做成抽象類(lèi).
11.2抽象類(lèi)的基本概念
11.3快速入門(mén)案例
11.4抽象類(lèi)的細(xì)節(jié)討論
11.5抽象類(lèi)的最佳實(shí)踐
抽象類(lèi)的最大價(jià)值是設(shè)計(jì),讓其他的人來(lái)繼承抽象類(lèi),并實(shí)現(xiàn)抽象方法.
11.6抽象類(lèi)的課后練習(xí)
?
第 12 章 接口
12.1看一個(gè)實(shí)際的需求
12.2接口的基本介紹
interface 接口名稱(chēng){
????? 常量;
?? 方法;
}
幾點(diǎn)說(shuō)明
12.3使用接口的好處
12.4快速入門(mén)案例
12.5接口的最佳實(shí)踐案例
12.6接口的應(yīng)用場(chǎng)景
總結(jié): 當(dāng)我們需要定義一些規(guī)范(方法)時(shí),可以將這些方法封裝到接口中 ,然后讓其他的類(lèi)來(lái)實(shí)現(xiàn)該接口即可.
12.7接口的細(xì)節(jié)討論
?
?
?
舉例說(shuō)明:
?
?
12.8類(lèi)定義的進(jìn)一步完善
12.9繼承類(lèi)vs 實(shí)現(xiàn)接口
?
?
?
?
?
第 13 章 final關(guān)鍵字
13.1基本介紹
當(dāng)程序員不希望某個(gè)成員方法被子類(lèi)重寫(xiě)時(shí),我們可以將該方法修飾為final 方法.
當(dāng)程序員不希望某個(gè)類(lèi)被繼承,我們可以將該類(lèi)修飾為final 類(lèi).
final "最終"
13.2基本語(yǔ)法
final 類(lèi)名{
????? final 訪問(wèn)修飾符 function 方法名(){
????? ?????? //函數(shù)體??????
}
}
13.3快速入門(mén)案例
總結(jié)
13.4final 的使用細(xì)節(jié)討論
?
第 14 章 類(lèi)常量(const關(guān)鍵字)
14.1為什么需要使用當(dāng)類(lèi)常量
在某些情況下,程序員可能有這樣的需求:
當(dāng)不希望一個(gè)成員變量被修改,希望該變量的值是固定不變的。這時(shí)可以用const 去修飾該成員屬性,這樣這個(gè)屬性就自動(dòng)成為常量 , 比如所得稅率, 數(shù)學(xué)中的圓周率等
14.2類(lèi)常量的基本語(yǔ)法
類(lèi)常量是在類(lèi)中定義的.
class? 類(lèi)名{
????? const 常量名 = 初始值;
}
說(shuō)明
14.3快速入門(mén)案例
//計(jì)算公司所得稅的案例.
14.4關(guān)于類(lèi)常量的使用細(xì)節(jié)說(shuō)明
在類(lèi)的內(nèi)部訪問(wèn):?? 類(lèi)名::常量名??? self::常量名?? 接口::常量名
在類(lèi)的外部訪問(wèn):? 類(lèi)名::常量名? 接口名::常量名??
結(jié)論: 常量可以是 基本數(shù)據(jù)類(lèi)型(int, float , bool, string), 還是可以是 array ,但是不能是對(duì)象。
?
?
第 15 章 PHP面向?qū)ο缶幊痰南嚓P(guān)技術(shù)
基本: 把php面向?qū)ο缶幊痰母鱾€(gè)知識(shí)點(diǎn)都過(guò)一下.
15.1對(duì)象克隆技術(shù)和分析
15.2對(duì)象遍歷[了解,應(yīng)付筆試]
在類(lèi)的外部對(duì)對(duì)象進(jìn)行遍歷, 這時(shí)我們只能遍歷到對(duì)象的public 屬性.
15.3php的內(nèi)置標(biāo)準(zhǔn)類(lèi)
看一個(gè)具體的需要: 如果,我們希望把一些數(shù)據(jù),以對(duì)象的屬性的方式存儲(chǔ),同時(shí)我們又不想定義一個(gè)類(lèi),可以考慮使用 PHP內(nèi)置標(biāo)準(zhǔn)類(lèi) stdClass [standard標(biāo)準(zhǔn)]
php的內(nèi)置標(biāo)準(zhǔn)類(lèi) stdClass , 這個(gè)是系統(tǒng)默認(rèn)提供,不需要程序員去創(chuàng)建,而是直接使用就可以.
案例說(shuō)明:
15.4數(shù)據(jù)類(lèi)型轉(zhuǎn)對(duì)象和對(duì)象轉(zhuǎn)數(shù)組的說(shuō)明
在我們的開(kāi)發(fā)中,有時(shí)會(huì)看到有人將數(shù)組或者基本數(shù)據(jù)類(lèi)轉(zhuǎn)成對(duì)象,那么這個(gè)是怎么回事?
15.5對(duì)象序列化和反序列化
所謂對(duì)象序列化是指: 將一個(gè)對(duì)象轉(zhuǎn)換成一個(gè)字符串,這個(gè)字符串包括 屬性名,屬性值,屬性類(lèi)型, 和該對(duì)象對(duì)應(yīng)的類(lèi)名。簡(jiǎn)單的說(shuō)明就把一個(gè)對(duì)象的數(shù)據(jù)和數(shù)據(jù)類(lèi)型轉(zhuǎn)成字符串.
我要求同學(xué)們講一個(gè)對(duì)象保存到文件中.(freeze 冷凍)-對(duì)象序列化.
?
所謂反序列化就是指,將一個(gè)序列化的字符串,重新恢復(fù)成對(duì)應(yīng)的對(duì)象.
說(shuō)明
- 對(duì)象序列化利于對(duì)象的保存和傳輸
- 可以讓多個(gè)文件共享對(duì)象,而且我們將序列化后的對(duì)象保存到文件中,還可以達(dá)到在不同的時(shí)間段操作該對(duì)象.
代碼說(shuō)明:
__wakeup() 經(jīng)常用在反序列化操作中,例如重新建立數(shù)據(jù)庫(kù)連接,或執(zhí)行其它初始化操作。
??? ?????? ?????? 代碼說(shuō)明:
15.6類(lèi)與對(duì)象的相關(guān)函數(shù)
在面向?qū)ο缶幊讨?#xff0c;有一系列的函數(shù),可以來(lái)對(duì)類(lèi)和對(duì)象以及成員方法進(jìn)行操作。我們重點(diǎn)講解5個(gè),其它的函數(shù)就請(qǐng)同學(xué)們自己去看一下即可.
代碼舉例說(shuō)明:
15.7traits 的講解(重點(diǎn))
?
第 16 章 反射技術(shù)
16.1當(dāng)我們echo $對(duì)象時(shí),輸出該對(duì)象的屬性,成員方法等等信息
16.2反射機(jī)制的基本介紹
PHP 5 具有完整的反射 API,添加了對(duì)類(lèi)、接口、函數(shù)、方法和擴(kuò)展進(jìn)行反向工程的能力。 此外,反射 API 提供了方法來(lái)取出函數(shù)、類(lèi)和方法中的文檔注釋。
16.3反射機(jī)制的使用場(chǎng)景
16.4看一個(gè)需求-一會(huì)我們一起搞定他
16.5我們看一個(gè)簡(jiǎn)單的案例-反向代理調(diào)用
16.6反射機(jī)制的綜合小練習(xí)-tp的控制器調(diào)度原理
走代碼:
16.7反射練習(xí)
?
16.8小結(jié):
?
?
文章來(lái)自泰牛PHP課堂筆記
?
?
總結(jié)
- 上一篇: tp5中mysql使用REGEXP 正则
- 下一篇: 解压文件zip