[TOC]
# 面向對象
面向對象存在問題是越來越多的語言引入函數式編程的特征,如閉包,回調等,php也引入了一些
## 類
一個類的設計需要能充分展示其最重要的屬性和方法,并且能與其他事物區分.只有類本身有意義,從抽象到具體的實例化才有意義
類是屬性和方法的集合,那么在php里,對象是什么?比較普遍的說法是:"對象由屬性和方法組成".
對象由屬性組成,一個對象的屬性是它區別于另一個對象的關鍵所在
由于**php對象是用數組來模擬的**,因此我們把對象轉為數組,就能看到這個對象所擁有的屬性了
序列化后的對象會附帶所屬類名,這個類名保證此對象能夠在執行類的方法(也就是自己能執行的方法)時,可以正確找到方法所在的代碼空間(即對象所擁有的方法存儲在類里).
另外,當一個對象的實例變量引用其他對象時,序列化該對象時也會引用對象進行序列化
類和對象是不可分割的,有對象就必定有一個類和其對應,否則這個對象也就成了沒有親人和孩子(但有一個特殊情況,就是由標量進行強制類型轉換的object,沒有一個類和他對應.此時,php中一個稱為孤兒的stdclass類就會收留這個對象
## 重載
php的重載和java等語言的重載不同.java里重載指一個類可以定義參數列表不同但名字想太多多個方法.比如,java也有構造函數,java允許多個構造函數,只要保證方法簽名不一樣就行,而php則在一個類里只允許有一個構造函數
php提供的重載指動態的創建類屬性和方法.因此`__set和__get`被歸類到重載這里
java中構造方法比php好用,php由于有了`__set和__get`,這個魔術方法,使得動態增加對象的屬性字段變得很方便,而對java來說,要實現類似的效果,就不得不借助反射API或直接修改編譯后字節碼的方式來實現
## 繼承和多態
**繼承和多態都是對類的復用,他們一個是類級別的復用,一個是方法級別的復用**
用parent自帶父類,用self指代自身用`::`運算符(范圍解析操作符)調用父類的方法.
`::`操作符還用來作為類常量和靜態方法調用
多態的確切含義是:同一個類的對象收到相同消息時,會得到不同的結果.而這個消息是不可預測的.多態顧名思義,就是多種狀態,也就是多種結果
**重載并不是面向對象里的東西,和多態也不是一個概念,它屬于多態的一個表現形式**
---
php是弱類型的,并且也沒有對象轉型的機制,所以不能像c++或者java那樣實現
~~~
father $pf = new son;
~~~
把派生類對象賦給基類對象,然后在調用函數時動態改變其指向
在php中,對象都是確定的,是不同類的對象
---
**區別在于多態關鍵在于看對象是否屬于同一類型.如果把他們看作同一類型,調用相同函數,返回了不同結果,那么他們就是多態;否則,不能稱為多態**
---
注意
類型轉換不是多態
php中父類和子類看作"繼父"和"繼子"關系,但不存在血緣關系.因此子類無法向上轉型為父類,從而失去多態最典型的特征
**多態的本質就是if...else,只不過實現的層級不同**
## 繼承和組合
`繼承是一種"是,像"的關系,而組合是一種"需要"關系`
可以很簡單的判斷出父親和兒子應該是繼承關系,父親與家庭是組合關系
**組合偏重整體與局部關系,而繼承側重父與子的關系**

注意:
子類是一個特殊類型,不是父類的一個角色
**底層代碼多用組合,頂層/業務代碼多用繼承.底層用組合可以提高效率,避免對象臃腫.頂層代碼用繼承可以提高靈活性,讓業務使用更方便**
---
**繼承并非一無視處,而組合也并不是完美無缺.如果既要組合的靈活,又要繼承的代碼簡潔,能做到嗎?**
這個可以做到,比如多繼承,c++就是使用這種模型來增強繼承的靈活性的
多重繼承太復雜,那么還有其他方式能比較好的解決這個問題嗎?
traits就是一種很好的解決方案
- 書列表
- laravel框架關鍵技術
- 第一章 組件化開發與composer使用
- 簡介
- composer
- 添加路由組件
- 添加控制器模塊
- 添加模型組件
- 添加視圖組件
- 第三章 laravel框架中常用的php語法
- 匿名函數
- 文件包含
- 魔術方法
- 魔術常量
- 反射
- 后期靜態綁定
- traits
- 第四章 laravel框架中使用的HTTP協議基礎
- HTTP協議
- 數據庫
- 數據遷移
- 第六章 laravel框架中的設計模式
- IOC模式
- php核心技術與最佳實踐
- 第一章面向對象核心
- 反射
- 簡單ORM
- 異常和錯誤
- 接口
- 第二章,面向對象設計
- 設計原則
- 單一職責
- 接口隔離
- 開放封閉
- 替換原則
- 依賴倒置
- linux是怎么寫的呢?
- 第三章 正則表達
- 認識正則
- 第四章 php網絡技術應用
- HTTP協議詳解
- php和http相關函數
- 垃圾信息防御措施
- 現代操作系統
- 引論
- sql必知必會
- 限制結果
- 按位置排序
- where求職順序
- IN操作符
- like
- 函數
- group by
- 組合查詢
- 插入檢索出的數據
- 視圖
- 高性能mysql
- 第一章節 mysql架構與歷史
- mysql架構邏輯圖
- 連接與管理
- 優化與運行
- 讀寫鎖
- 鎖粒度
- 表鎖(table lock)
- 行級鎖(row lock)
- ACID
- 隔離級別
- 死鎖
- 隱式和顯式鎖定
- 多版本并發控制
- Innodb概覽
- 第四章節 Schema與數據類型優化
- 選擇優化的數據類型
- 日期和時間類型
- 標識列
- 特殊類型數據
- 表設計中的缺陷
- 范式
- 計數器表
- 第五章 創建高性能索引
- 索引基礎
- 索引類型
- 索引的優點
- 高性能索引策略
- 選擇合適的索引列順序
- 聚簇索引
- 順序的主鍵什么時候會造成更壞的后果
- 覆蓋索引
- 使用索引掃描來做排序
- 壓縮索引
- 冗余和重復索引
- 索引和鎖
- 支持多種過濾條件
- 什么是范圍條件
- 優化排序
- 維護索引和表
- 表損壞
- 減少索引和數據的碎片
- 第六章 查詢性能優化
- 掃描的行數和訪問類型
- 重構查詢方式
- 查詢執行的基礎
- 重構-改善既有代碼設計
- 第一章-重構
- 什么是重構
- 第一個案列
- 重構第一步
- 王垠博客
- 多態取代價格相關邏輯