PHP-OOP-Foundamentals 系列教材(TutsPlus)
Bobo 的練習紀錄+課堂筆記
時數:2H 20M (共18集)
課程章節:
- 02 what is oop
- 03 classes vs objects
- 04 class constants and internal reference
- 05 public vs private scope
- 06 copying vs cloning
- 07 single responsibility principle
- 08 magic methods
- 09 autoloading through spl
- 10 namespaces
- 11 autoloading with psr 0
- 12 class inheritance and protected scope
- 13 overriding parent methods
- 14 abstract classes
- 15 interfaces
- 16 statics
- 17 traits
- 18 dependency injection
OOP 因為可將 property 設定為 private ,始外界無法直接存取,達到了封裝的功能。
所以需要藉由 set()
和 get()
來存取,
且因為太常用了封裝成魔術方法 __set()
和 __get()
來存取。
在存取的過程中,為了避免外界不知道此 class 有哪些 methods 而輸入錯誤
因次需要先在 class 定義 $fillable
來確認有哪些方法可以被 set
例如 private $fillable = array('email', 'password'); 定義 $accessible 來確認有哪些方法可以被 get 例如 private $accessible = array('email');,
建構式(construct)用途:
- 設置類別預設屬性值。
- 預載類別特定函式。
private 成員,通常習慣在名稱開頭加上一個_(底線)來區別。
-
PHP Object copy 預設為 by reference。
-
若是要 by value 需要使用 clone 指令。
依據 single responsibility principle
(SRP,單一職責)
每個 class 只負責一個職責而且職責必須要被封裝在這個 class 內, have only one reason to change
原本在 User 內的 Validation 應該要抽出來,可以 reuse。
兩個底線開頭的就是 魔術方法
,介紹這些:
__construct()
__set()
__get()
__toString()
魔術方法讓你的物件更神奇,可以關注到特定事件(eg. 物件被建立/刪除時..等) 詳見範例。
使用 spl_autoload_register()
註冊 load 方法,來達到 autoloading
PHP5.3才加入的功能,最主要的目的是用來組織類別與函數,並且避免名稱的衝突
例如:
use Symfony\Component\Console\Input\ArrayInput;
表示使用 位在目錄 Symfony\Component\Console\內的檔名叫ArrayInput 的 class檔案
使用 require 將檔案載進來,再配合 namespace\方法 (若有自動載入,就不需要再各自include了方便!)
關鍵字 (keyword) use
可替過長的命名空間中的類別 (class) 取別名 (alias)
例如:
use Name01\Name02\Name03\Demo as Another;
__NAMESPACE__
// 使用此魔術常數 取得目前的 namespace
如果檔案沒有使用命名空間,則此檔內所有的 class、method 常數... 皆為全域
要使用這些 全域 class、method 可使用 \
反斜線開頭,代表這是定義在global namespace
中的東西
\
白話解釋就是從跟目錄開始找啦
autoload function 請直接使用 PSR-0 的規範,直接貼上即可 這函數其實就是依照 PSR-0 大家約定好的命名方式,來把 Class 的檔名給切出來
autoloading 機制,原理其實很簡單。在程式產生一個類別實體時,如果找不到類別定義,就會來呼叫使用者定義的 autoloading 函數,把完整的類別名稱當做參數丟給他。
2014/10之後,建議使用 PSR-4 取代 PSR-0
無須對外界公開的方法都應該設定為 private,才有利於封裝。
封閉性 private > protected > public
繼承: 繼承代表一種 "is-a" 的關係。
父類別的方法可以被子類別覆寫。
抽象 class 無法被實體化,主要用來繼承用的。
- 功能1.介面就像是個合約,定義與規範必須實做那些方法,並且可以實現OOP的重要特色(多形)。
- 功能2.把相同操作的 class 給解耦合。
PostJsonRepository
、PostRssRepository
這兩個 class 實作 PostRepository 這個介面,分別可讀入 Json
和 Xml
檔
讀入檔案分別使用 file_get_contents() 與 simplexml_load_file() 函數
Using static properties and methods can help you write less verbose code. But bear in mind, statics do not behave like true objects(因為static關係,即使你new 2個物件出來,實際上存取的還是同一個物件,這點必須要注意).
替 class 加入特定的一組方法,讓這些方法可以在不同物件之間 reuse 例如加入 Accessible 這個 class 有 __set() , __get() 方法
使用方法:在 class 內
(注意不是在外面喔)使用 use
就是使用 traits
DI 主要用來解耦合,真正有效的降低模組間耦合的作法
Address class 接受 不同的 Repository
介面注入,例如 AddressArrayRepository
,且實作 AddressRepositoryInterface
介面
實作 原本 AddressArrayRepository 是在 Address 內直接進行實體化(在 __construct 那),這導致了這兩個 class 產生了耦合,
這個系列看完後建議繼續學習 TutsPlus 的 Object - Oriented Design in PHP