# 第二程式語言習得?從JavaScript經驗學習PHP語法類比為例
###### tags: `JavaScript` `PHP` `Express.js` `Laravel` `語法`
## JavaScript(with Express) VS PHP(with Laravel)
- 二者生態環境風格比較心得:輕量、多元、設定 VS 整合、單純、慣例?
- 由於筆者是先學Javascript(JS),會偏向從以熟悉的JS邏輯「轉譯」成PHP的
- 推薦PHP入門中文書目([皆可在Hyread One圖書館線上借閱](https://one.ebook.hyread.com.tw/index.jsp)):
- 語法方面由於語言及框架不斷更新,請以網路上的新版文件為準,書籍主要是輔助理解
1. [漫話PHP:史上最易懂的PHP手冊](https://one.ebook.hyread.com.tw/bookDetail.jsp?id=120374)
- 雖然是2017年的舊書但較易閱讀,且能複習開發基本流程與理解傳統無框架方案
2. [PHP動態網站系統開發與Laravel框架運用](https://one.ebook.hyread.com.tw/bookDetail.jsp?id=226970)
- 從初學者角度介紹PHP與Laravel,PHP部分篇幅較多,內容相對詳盡易懂
3. [使用Laravel 8 PHP主流框架打造RESTful API](https://one.ebook.hyread.com.tw/bookDetail.jsp?id=237881)
- 定位同上,但相對簡潔留白,集中在Laravel部分,內容改編自[鐵人賽文章系列](https://ithelp.ithome.com.tw/users/20105865/ironman/2466)
## 語法類比說明:
- 類似文章(有討論細部語法比較的,不只是特色列舉):
- [PHP Vs Javascript: The Right Tech For Your Next Big Project](https://www.clariontech.com/blog/php-vs-javascript-the-right-option-for-your-next-big-project)
- [PHP vs JavaScript: An In-Depth Comparison of the Two Scripting Languages](https://kinsta.com/blog/php-vs-javascript/)
- [Learning JavaScript from PHP - a Comparison](https://www.lullabot.com/articles/learning-javascript-from-php-a-comparison)
- [PHP 轉 Node 筆記(一. 談談兩者的差異)](https://iter01.com/62824.html)
- [PHP 轉 Node 筆記(二. 基礎的Web開發)](https://iter01.com/354910.html)
- [PHP Javascript 語法對照](https://learnku.com/articles/48467?order_by=vote_count&)
- [寫給JavaScript開發人員的PHP快速入門指南](https://developer.51cto.com/article/616226.html)
- 重點說在前頭:其實更多的是相似而非差異
- 邏輯甚至語法的通用,如運算符號、流程控制、條件迴圈、錯誤處理(try/catch)、註解寫法(//、/**/)、函式(function)、return、class......
- 先應用已經習得的概念,去找尋新學習程式語言/工具/函式庫/框架......等的對應寫法(人腦編譯的概念?)
## JS與PHP的寫法對照範例:
- 基本語法
- 語言格式: JS vs PHP
- 分號(;): 選加(可自動補上) vs 必加(否則會錯誤)
- 命名規則: camel case(全部) vs snake case(部分)
- 變數宣告: var/let vs $(改值也要加,取全域變數以$GLOBALS引入,另有靜態static/動態$$變數)
- 常數拼寫(const): 小寫 vs 大寫(另有define語法)
- 字串連接: + "" vs .""
- 內部調用: . vs ::/->
- 內建函式
- 訊息輸出: console.log() vs echo(較快,無回傳值)/print(後面可選加括號)/print_r(陣列)error_log(僅終端機訊息);
- 變數屬性: typeof & .length vs var_dump()
- 小數點調整: .toFixed() vs round(,)
- 取整數值: parstInt() vs intval()
- 建立陣列: (new) Array() vs array()
- 操作陣列: .push()/.pop() vs array_push()/array_pop()
- 鍵-值格式的物件/關聯(索引)陣列: {key: value} vs [key => values]/new stdClass()/json_encode()
- 回傳JSON: JSON.stringify(與Object格式87趴像,有時不用特別互轉) vs json_encode()
- 介面(interface):TypeScript才有(檢查型別) / PHP內建(較類似能同時繼承的class)
- 與HTML、後端框架等其他檔案使用的寫法
- 標籤註記: <script>(.html內,前端運算)/(.js內不須標籤,html以字串形式操作)/<%(EJS,後端模板) vs <?php(不能省略否則無法運作)/<?(設定可用簡寫)
- URL參數: :id vs {id}
- 引入目錄的其他檔案:require(CommonJS)/import(ES6)+變數 vs require(/_once避免重複引入,缺少跳錯誤停止)/include(/_once避免重複引入,缺少跳警告仍可用作)/use(namespace,算虛擬目錄,原生JS無此概念)+as
- 取得URL query string(GET)的值:URLSearchParams(window.location.search)(前端)/req.query(後端) vs $_GET(PHP) / $request->query(Laravel)
- 取得POST的值:Request.body(前端)/req.body(後端) vs $_POST(PHP) / $request(Laravel)
- 呼叫API:fetch() vs curl_setopt()
- cookie/session設定:第三方套件 vs 原生語法(setcookie/$_SESSION)
- 讀取檔案:前端透過HTML(<input type='file' />)/後端引入node.js內建模組(fs.readFile) vs 原生變數語法(file())/框架內driver
- 讀取資料庫:前端不建議(安全問題)/後端第三方套件 vs 原生變數語法(mysql_connect())/框架內driver
- 補充:安裝方式與常用套件
- 安裝模式:node.js選裝其他軟體 vs AMP組合安裝(MAMP-Mac或Windows推薦, phpMyAdmin-Linux環境推薦)
- 搭配伺服器軟體:內建 vs Apache/Nginx
- 版本管理:nvm vs PHPBrew
- 使用[MAMP](https://progressbar.tw/posts/28)建立開發環境的話,可以從設定更改使用的PHP版本,也可以從PHP官網抓新版替換,並修改環境變數相關的安裝位置
- 套件管理:npm vs composer
- 主流框架:Express(輕量,只包含基本套件) vs Laravel(全功能學Rails黑魔法……)
- 啟動指令:npm run start vs php artisan serve
- 模板引擎:Handlebars/EJS/… vs Blade/Native PHP/…
- 知名ORM: Sequelize vs Eloquent(Artisan命令)
- Generator:express generator vs laravel (global)
- 常見測試:Mocha/Jest vs PHPUnit(Artisan命令)
- Coding Style:Standard/Airbnb/Google/… vs PSR