--- tags: PHP / Laravel / Lumen --- # Laravel 教學前傳 - 淺談PHP與物件導向 ### 本篇介紹 > 本篇將概述PHP之coding style,包含函數定義與其他特性 在接觸Laravel這優美的程式碼之前,先讓我們來了解一下PHP與它的coding style吧! ### Coding Style PHP為弱型別語言,基本上設定變數時,不須特別定義它的型態,像一般程式語言,例如C++等,定義變數如下: int number = 0; #### 而PHP只需要前面加上「$」,即為變數的定義: $number = 0; #### 陣列: ```php // good $testArray = []; // bad $testArray = array(); ``` #### 條件判斷 也因為PHP是弱型別語言,因此在條件判斷上需更加嚴謹,如: ```php $msgFirst = 'hello'; $msgSecond = 'hello'; // good if ($msgFirst === $msgSecond) { echo 'equal'; } // not good if ($msgFirst == $msgSecond) { echo 'equal'; } ``` * == 僅判斷value是否相同 * === 為判斷value與型別是否相同 #### 三元表達式: ```php public function checkValue($paramA, $paramB) { return $paramA === $paramB ? true : false; } public function checkNull($data) { $resultA = $data ? true : false; $resultB = !is_null($data) ? true : false; $resultC = !!$data; } ``` * checkValue 方法為判斷兩參數是否相等,相等則回傳true,否則為false * checkNull 方法為判斷參數是否為null,不為null回傳true,否則為false,上述三種方法皆可 #### 空格與換行: * 4格空白,且「一般陳述句」之「左大括號」不須換行,而保留字與小括號之間,需空白 ```php // correct foreach ($datas as $key => $data) { // code } // incorrect foreach($datas as $key => $data) { // code } ``` * 而類別(class)與其function,大括號需換行 ```php class PostController extends Controller { public function index() { // code } } ``` #### 命名規則: * 若為一般變數或function,我們採用「**小駝峰**」進行命名,即首個單字開頭小寫,其他單字開頭大寫 ```php // 變數 $postInfo = 'I am a variable'; // function public function getPeopleInfo() { // code } ``` * 類別(class)使用**大駝峰**,即單字開頭大寫 ```php class PostRepository { // code } ``` #### 陳述句: ```php // if-else if (condition) { ... } elseif (condition) { ... } else { ... } // switch-case switch (condition) { case value_1: ... break; case value_2: ... break; default: ... break; } // try-catch-finally try { ... } catch (Exception $e) { ... } finally { ... } // while-loop while ($condition) { ... } // do-while-loop do { ... } while ($condition); // foreach-loop foreach ($datas as $key => $data) { ... } // for-loop for ($i = 0; $i < 5; $i++) { ... } ``` #### 類別屬性設定與成員調用: ```php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Repositories\PostRepository; class PostController extends Controller { private $testNum; protected $postRepo; public function __construct(PostRepository $postRepo) { $this->testNum = 0; $this->postRepo = $postRepo; } // ... } ``` * 若需使用到類別中的方法或變數,須加上「$this->」指向該class中的某一屬性或方法 * 「__construct」為PHP中類別的建構函數,即物件的初始狀態,也可將類別在此實例化為物件 * 「$testNum」為該類別的屬性,並修飾其為private,該屬性能在內部被隨時調用,並指定其初始值為0 * 「$postRepo」為該類別protected性質的屬性,用於當PostRepository被實例化為物件時的接收屬性 * 「extends」為讓該類別能繼承其他類別的方法與屬性 * PHP中,中括號表示該變數為array型態;若使用「->」表示該變數為object型態,如$data['name'] 與 $data->name #### private、protected與public的差異 * private:物件實現後,該屬性無法被繼承,且僅限於該類別中使用 * protected:物件實現後,該屬性僅限於該類別中使用,但可被繼承於子類別 * public:物件實現後,該屬性允許被繼承與使用 #### 類別?物件?實例化? 例如今天你想要建造一棟房子,你需要一份施工藍圖(**類別**)來規劃這棟建築物的材料(**屬性**),或者......恩我不是這行的專業我也不知道有什麼,並且依據藍圖來把建築物給實現、建造(**實例化**),最後將房子建造出來(**物件**) 翻譯: 透過類別來定義屬性與方法,並藉由實例化將其實現成一個物件