---
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:物件實現後,該屬性允許被繼承與使用
#### 類別?物件?實例化?
例如今天你想要建造一棟房子,你需要一份施工藍圖(**類別**)來規劃這棟建築物的材料(**屬性**),或者......恩我不是這行的專業我也不知道有什麼,並且依據藍圖來把建築物給實現、建造(**實例化**),最後將房子建造出來(**物件**)
翻譯:
透過類別來定義屬性與方法,並藉由實例化將其實現成一個物件