發表文章

目前顯示的是有「PHP」標籤的文章

PHP CodeIgniter 3 單元測試日常:建立 PHPUnit 測試環境

圖片
本文將帶領讀者建立 CodeIgniter 3 框架的 PHPUnit 測試環境,給 CodeIgniter 3 一個現代化的機會! 本文假設您已經具備 軟體測試自動化 以及 PHPUnit 相關知識,且了解如何撰寫測試案例。若您尚未了解單元測試或軟體測試自動化,這裡提供一些不錯的資源讓您初步了解: otischou.tw:瞭解單元測試 阿川先生:先寫單元測試的12個好處! 除了上面兩個資源外,請您務必花時間認識並學習軟體測試,這可以說是軟體開發技術的核心技能之一。 若您尚未了解 PHPUnit 這裡也有些簡單的文件供您參考: PHPUnit 官方中文文件 Jace Ju:PHPUnit 入門介紹 前言 2020 年對於 PHP 界風靡一時的 MVC 框架「CodeIgniter」來說,光環已經被新星 Laravel 搶去。雖然 CodeIgniter 的討論熱度已經消退了,但市佔率仍然相當高,至今仍有許多 PHPer 還在與 CodeIgniter 奮鬥和成長(包括我)。 由於 CodeIgniter 3 框架(以下簡稱 CI3)沒有使用 Namespace 的特性,加上 CI3 統一透過框架內建的 Loader 類別實現 Autoload 機制,造成很多 PHPer 沒辦法在 CI3 框架中使用現代 PHP 的特性來開發系統。若不做點手腳的話,PHPer 的開發思維很容易就會被 CI3 框架綁架,一不小心就將所有業務邏輯全部寫在 CI3 框架中。換句話說所有的程式碼都依賴於框架,物件導向 SOLID 原則的實現、設計模式、單元測試 …等較進階的管理程式碼策略都不用談了! 為了讓還在與 CI3 奮鬥的同袍們能夠使用現代 PHP 的特性來開發系統,本文將介紹如何在 CI3 框架中建立單元測試的環境,讓 CI3 也能使用並測試現代 PHP 的程式碼,確保 PHPer 能安心地實現各種開發策略和思維。 導入 Composer 擁抱現代 PHP 特性 其實 CI3 跟現代 PHP 只差臨門一腳,你可以在 config/Config.php 中找到一個設定為 composer_autoload ,只要替 composer_autoload 設定 Composer 目錄底下的 autoload.php 路徑,你的

CodeIgniter 框架擴展:HMVC

圖片
CodeIgniter 框架擴展:HMVC Hierarchical((階層式的))-Model-View-Controller(HMVC)模式,也可以叫做 Layered MVC。 為什麼需要 HMVC 單層 MVC 的限制 原 MVC 架構中只有單層 MVC ,單層 MVC 的設計本身沒問題,但隨著系統功能漸變多變複雜時,程式碼卻只能塞進單層 MVC 裡面,程式碼很快就會變得  巨大、縱錯複雜、互相耦合、難以維護 。試想一下,一個 Controller 內有 7、8 千行程式碼會容易維護嗎。 原 CodeIgniter MVC 架構(單層 MVC)示意圖: application |- controllers |- controllersA.php |- controllersB.php |- ...(所有 Controller 都只能放在同一層) |- models |- models1.php |- models2.php |- ...(所有 Model 都只能放在同一層) |- views |- views1 |- index.php |- footer.php |- ... |- views2 |- index.php |- footer.php HMVC 帶來的解決方案: 擴展 MVC 架構, 讓 MVC 底下可以再擴充一層或多層子 MVC ,讓單層 MVC 變成階層式 MVC,而這些擴充出來的 MVC,又稱作為模組、模塊(Modules)。 使用模組好處是: 使每個功能都可以獨立出來 因模組變得獨立,降低各個功能模組之間的耦合性 提高程式碼複用性 每個模組都有自己的 MVC 結構 HMVC 架構示意圖: CodeIgniter HMVC 擴展模組後,其結構(階層式 MVC)如下: application |- modules |- moduleA

在 CI 測試環境中使用 SQLite

Why SQLite?In Memory 模式 SQLite 可開啟 In Memory 模式 在記憶體中操作資料庫 ,程式關閉後,記憶體內的 SQLite 資料庫也會清空,相當適合測試環境使用(無副作用)。 建置步驟: 產生假資料,先匯出 MySQL 備份檔 將 MySQL 的備份檔轉換成 SQLite 格式的備份檔。 最後再將 SQLite 備份檔配置到 CodeIgniter 的 database.php 設定檔中。 config/database.php if (ENVIRONMENT == "testing" ) { $db [ 'main' ] = [ 'dsn' => ':memory:' , // 啟動 In Memory 模式 'hostname' => '' , // 不需填寫 'username' => '' , // 不需填寫 'password' => '' , // 不需填寫 'database' => APPPATH . 'database/sqlite/sqlite.db' , // SQLite 備份檔案,絕對路徑。 'dbdriver' => 'sqlite3' , // 使用 SQLite 'dbprefix' => '' , 'pconnect

PHP 錯誤:Unable to load dynamic library

圖片
Unable to load dynamic library 錯誤訊息 Failed loading /usr/local/php5/lib/php/extensions/no-debug-non-zts-20160303/opcache.so: dlopen(/usr/local/php5/lib/php/extensions/no-debug-non-zts-20160303/opcache.so, 9): Symbol not found: _pcre_globals Referenced from: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20160303/opcache.so Expected in: flat namespace in /usr/local/php5/lib/php/extensions/no-debug-non-zts-20160303/opcache.so ... 省略 遭遇過程: 最近將 PHP 從 PHP5.6 更新至 PHP7.1。使用 PHPStorm 要進行單元測試時,報錯了: 從錯誤訊息可看見有幾個 PHP 插件沒辦法被載入,導致我的 PHPUnit 沒辦法順利執行,並且得到一個提示訊息為: Expected in: flat namespace 發生原因: 一番查證後,原來 Expected in: flat namespace 是 C++ 層級的錯誤例外訊息。 這段訊息會在「程式環境沒有辦法編譯插件」的時候跳出!(程式環境指的是 PHP5、PHP7、Python 等正在運行的程式。) PHP 沒辦法順利編譯插件?但這些插件明明在啟動 Apache 時都被順利載入了,到底發生什麼事呢? 在一般情況下 PHP7.1 確實可以正常編譯這些套件,但在 PHP-CLI 模式下進行 PHPUnit 時卻又編譯失敗?這些跡象已經指出, 一定是 PHP-CLI 的編譯器指錯版本了 ! 打開 PHPStorm > Preferences > Language & Framework > PHP,檢查 PHP-CLI 版本是否有問題: PHP7.1 與 PHP

在 Mac 上切換 PHP 版本

圖片
在 Mac 上切換 PHP 版本 如果你是使用 Liip PHP 替你的 Mac 安裝 PHP 的話,那麼恭喜你,切換 PHP 版本會變得非常簡單。 安裝任何 Liip PHP 之前,做好備份! 雖然切換版本很簡單,但也有應注意事項!!! 安裝 Liip PHP 後,會覆蓋原本在 /ect/apache2 目錄底下的設定檔案 ,所以在安裝任何 Liip PHP 之前, 記得先做好備份 ,以便將設定復原。 更好的做法是,把自己客製化的設定,額外拉出一個設定檔案。等安裝完成後再 Include 即可。 一但做好備份後,就可以開始進行安裝囉! 如何切換 PHP 版本 當您同時安裝多個版本的 Liip PHP 時,可以在 /usr/local 目錄下看見所有版本的 PHP : 根據 Liip PHP 的設定,不論您安裝任何版本, Liip PHP 一律會從 /usr/local/php5 這個路徑執行 PHP 。 然而 /usr/local/php5 只是一個捷徑,並且指向這個目錄下其中一個版本的 PHP: 由此可知,如果 想要切換 PHP 版本,只需要替換 php5 這個捷徑即可 。 切換捷徑即可替換 PHP 版本 cd /usr/local rm php5 ln -s php5-7.3.0alpha3-20180705-141106 php5 快速切換 PHP 版本: 如果每次切換版本都要手動砍捷徑太麻煩了,也可以寫一個 Base Shell 指令稿來替你切換版本。 首先新增一個 switch_php.sh 檔案: #!/bin/bash # 使用方法: # ./switch_php.sh <version> # ./switch_php.sh php5 # ./switch_php.sh php7 # activate php56 if [ "$1" == "php5" ]; then sudo rm /usr/local/php5 sudo ln -s /usr/local/php5-5.6.14-20151002-085853 /usr/local/php5 echo "activated p