發表文章

PHP 傳值與傳址

物件傳值與傳址 by Value & by Reference 本章節將會學習傳值與傳址的概念(Call by value & Call by reference),以及透過實地演練來觀察兩者之間的差異。 傳値 Call by value

PHP 單元測試 第一次進行測試

圖片
再進行此章節之前,如果還沒安裝過 PHPUnit 的朋友,可以先前往 PHPUnit 安裝篇  學習怎麼安裝唷!

閉包 Closure

閉包 Closure 閉包可以用來解偶 function 之間的依賴。 // 用閉包的方式建立一個通用的單例模式 var getSingle = function (fn) { var result; return function () { return result || (result = fn.apply( this .arguments)); } } // 建立登入彈跳視窗 var createLoginDiv = function () { var div = document .createElement( 'div' ); div.innerHTML = '我是登入彈出視窗' ; div.style.display = 'none' ; document .body.appendChild(div); return div; } // 套用 getSingle 閉包 var createSingleLoginDiv = getSingle(createLoginDiv); // 當按下登入按鈕時建立並顯示「登入彈跳視窗」 document .getElementById( 'loginBtn' ).onclick = function () { var loginLayer = createSingleLoginDiv(); loginLayer.style.display = 'block' ; }; /** * getSingle 可以輕鬆套用其他 function */ var createScript = function () { ... } var createIframe = function () { ... } var createButton = function () { ... } var createSingleScript = getSingle(createScript); var createSingleIframe = getSingle(creat

在 Codeigniter 上進行測試

圖片
在 Codeigniter 上進行測試 如果想在 CI 上面使用 PHPUnit 進行測試,可以使用 kenjis 提供的 ci-phpunit-test 。 ci-phpunit-test 讓你在 CI 上面可以很方便就能使用 PHPUnit。 不過使用這個套件之前,有一些必要條件: PHP 版本至少高於 5.4.0 CodeIgniter 至少要有 3.0 至少先安裝 PHPUnit 4.3 以上的版本 ci-phpunit-test 的目錄結構: codeigniter/ ├── application/ │ └── tests/ │ ├── _ci_phpunit_test/ ... 不要碰!裡面是 ci-phpunit-test 使用的檔案 │ ├── Bootstrap.php ... PHPUnit 的 bootstrap 設定檔 │ ├── DbTestCase.php ... 測試 DB 專用的 class │ ├── TestCase.php ... 測試案例專用的 class │ ├── controllers/ ... 把你的 controller 測試程式放進來 │ ├── libraries/ ... 把你的 library 測試程式放進來 │ ├── mocks/ │ │ └── libraries/ ... mock 模擬資料來源專用的 libraries │ ├── models/ ... 把你的 model 測試程式放進來 │ └── phpunit.xml ... PHPUnit 的設定檔 └── vendor/ 透過 Composer 進行安裝 到你的專案目錄下使用 composer 進行下載 ci-phpunit-test $ cd /path/to/codeigniter/ $ composer require kenjis/ci-phpunit-test --dev 下載完成後需要執行一次 install.php 你必須要在專案的根目錄執

PHP 單元測試 安裝篇

圖片
單元測試 PHP 都是用 PHPUnit 這個套件做單元測試。 安裝 PHPUnit 由於筆者仍在使用 PHP 5.6 ,所以以下範例皆是以 PHPUnit5 做介紹。(現在已經出到支援 PHP7.2 的 PHPUnit7) 1. 使用 Composer 安裝 1.cd 到你的專案目錄下 2.cd 到 composer.json 目錄 3.composer require --dev phpunit/phpunit ^5 安裝成功後,執行下列指令若出現 PHPUnit 5.7.26 by Sebasti... 代表安裝成功 *PHPUnit 執行檔會被放在 Composer/vendor/bin/phpunit,日後我們必須透過 phpunit 執行檔來進行測試。 2. 設定 alias (以下為 Osx 系統) 若想讓 phpunit 可以在任何地方都必呼叫, 可以到 ~/.base_profile 新增一條 alias 1. vi ~/.base_profile 2. 加入 alias phpunit="php /path to your project/Composer/vendor/bin/phpunit" 儲存後還要記得 source ~/.base_profile 使指令生效。 如此一來不管到哪個目錄都可以執行 phpunit 指令了! 待續.. ​

PHP OO 物件導向原則:依賴反轉原則DIP

圖片
OO_Principle_DIP 物件導向有五個原則 S.O.L.I.D. : 單一職責原則 SRP (Single Responsibility Principle) 開放封閉原則 OCP (Open Closed Principle) 里氏替換原則 LSP (Liskov Substitution Principle) 介面隔離原則 ISP (Interface Segregation Principle) 依賴反轉原則 DIP (Dependency Inversion Principle) 更多物件導向的理論的學習內容會整理到 PHP OO 的進階教學: 淺談物件導向 SOLID 原則對工程師的好處與如何影響能力 再談 SOLID 原則,Why SOLID?  依賴反轉原則 DIP (Dependency Inversion Principle) 一、定義與說明: 定義: 高階模組不應該依賴於低階模組,兩者都該依賴抽象。 High-level modules should not depend on low-level modules. Both should depend on abstractions. 抽象不應該由低階模組定義。 Abstractions should not depend on details. 低階模組的實作內容應該依照抽象的定義去打造。 Details should depend on abstractions. 高階與低階,是相對關係,其實也就是 呼叫者 (Caller) 與 被呼叫者 (Callee) 。 越高階的模組接近商業邏輯(電子商務買賣交易 流程 等),越低階的模組越接近實作邏輯(讀寫資料庫的、計算金額邏輯等) 接下來用範例來講解有沒有使用依賴反轉的差異吧! 範例: 如果你有遵守前幾項原則的話,要使用依賴反轉(DIP)就會變得很簡單唷! 現在,我們來做一個電子書 e-book 閱讀器的應用程式: class Test extends PHPUnit_Framework_TestCase { function testItCanReadAPDFBook () { $

PHP OO 物件導向原則:介面隔離原則ISP

圖片
OO_Principle_ISP 物件導向有五個原則 S.O.L.I.D. : 單一職責原則 SRP (Single Responsibility Principle) 開放封閉原則 OCP (Open Closed Principle) 里氏替換原則 LSP (Liskov Substitution Principle) 介面隔離原則 ISP (Interface Segregation Principle) 依賴反轉原則 DIP (Dependency Inversion Principle) 更多物件導向的理論的學習內容會整理到 PHP OO 的進階教學: 淺談物件導向 SOLID 原則對工程師的好處與如何影響能力 再談 SOLID 原則,Why SOLID?  介面隔離原則 ISP (Interface Segragation Principle) 到目前為止介紹: 單一職責原則講述:如何使用 actor 角色 的來設計類別。 開放封閉原則講述:類別設計的原則與擴增功能的方式。 里氏替換原則講述:子類別繼承與實作介面的約束。 最後,介面隔離原則講述:商業邏輯如何與 client 用戶 溝通。 一、定義與說明: 定義: 介面不應該強迫 Client 依賴於它們用不到的方法。 Clients should not be forced to depend upon interfaces that they don’t use. 類別之間的相依關係應該建立在最小的介面上 The dependency of one class to another one should depend on the smallest possible interface. 類別與類別之間的關係,應只依賴彼此需要的 最少介面 ,介面不能太肥,應該要細化。 每一個介面(Interface)應該把不相關的方法移除,盡可能地讓方法數量降到最低。 現在的所有模組化應用程式一定會提供讓 Client 可以依賴(使用)的介面, 這些介面可能是一些實作設計模式(如 Facade 模式)的物件,也可能是真的介面(Interface)。 不過一種介面並不重要,因為這些介面的目的都是 提供一個讓 C