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