SlideShare a Scribd company logo
1 of 52
Download to read offline
PHP 語法基礎與物件導向
范聖佑 Shengyou Fan
新北市樹林國⼩小 (2015/07/06)
適
⽤用
5.1
版
單元主題
• 複習 PHP 基礎語法
• 複習物件導向觀念,及如何使⽤用 PHP 實作物件導向
程式設計
• PHP 5.3+ 新語法及功能介紹
本單元將以後續⼯工作坊 (PHP 5.3+ 及 Laravel 5.1) 會使⽤用到的語法為主,更多語
法詳細內容請參考 PHP 官⽅方⽂文件及 Laravel 官⽅方⽂文件。
PHP	
  基礎語法
PHP
• 於 1995 年由 Rasmus Lerdorf 創始,並以開放源始碼
釋出,⾄至今已 20 年
• Personal Home Page、Hypertext Preprocessor
• ⼿手稿型程式語⾔言 (scripting language)
• 以直譯器 (interpreter) 動態編譯
• 動態、弱型別 (dynamic, weak typing)
• 當前最新穩定版為 5.6.10
• PHP 7 預定於今年 10 ⽉月釋出
兩種執⾏行⽅方式
• ⼀一般常⾒見 PHP 的執⾏行⽅方式,都是將 *.php 檔案放置
在網⾴頁伺服器的⽂文件根⺫⽬目錄底下,再透過瀏覽器瀏
覽執⾏行後看結果 (在本⼯工作坊就是使⽤用 uwamp 這個整合包)
• 由於 PHP 也有實作指令列模式,因此也可以在終端
機底下,以 php	
  {filename}.php 的⽅方式執⾏行某個
php 檔案,並在終端機底下看到執⾏行後的輸出結果
(在本⼯工作坊就是使⽤用 cmder 這個整合包)
• 換句話說,其實可以拿 PHP 來寫指令列⼯工具
P.S 要特別注意的是,要使⽤用指令列模式,除了 PHP 本⾝身要掛載正確的設
定外,也要將 PHP 載⼊入⾄至終端機本⾝身運⾏行的 PATH 內
宣告 PHP 區塊
• PHP 天⽣生的特性就是⼀一個樣板語⾔言,可以混合
HTML 直接輸出成網⾴頁
• 純⽂文字檔案,以 .php 結尾
• 撰寫 PHP 語法時,必須將語法以 <?php	
  ?> 宣告
• 直譯式語⾔言,每⼀一句以分號 ; 結尾
<?php	
  
	
  	
  	
  	
  //	
  php	
  語法寫在區塊內	
  
	
  	
  	
  	
  $var	
  =	
  'some	
  strings';	
  
?>	
  
<html>	
  
<head>	
  
<!-­‐-­‐	
  可以混合與	
  HTML	
  輸出	
  -­‐-­‐>
輸出語法
• PHP 常⾒見輸出變數內容的⽅方式有兩種
- 直接使⽤用 echo 語法
- 使⽤用 <?=	
  ?> 輸出變數
//	
  2-­‐declarations/index.php	
  
<?php	
  
	
  	
  	
  	
  $pageTitle	
  =	
  'Hello,	
  world';	
  
	
  	
  	
  	
  $pageContent	
  'Long	
  long	
  time	
  ago...';	
  
?>	
  
<html>	
  
<head><!-­‐-­‐	
  略	
  -­‐-­‐></head>	
  
<body>	
  
	
  	
  	
  	
  <h1><?php	
  echo	
  $pageTitle;	
  ?></h1>	
  
	
  	
  	
  	
  <p><?=$pageContent?></p>	
  
</body>	
  
</html>
註解
• PHP 的註解型式有兩種:
• 單⾏行/⾏行內式
• 多⾏行/區塊式
//	
  3-­‐comments/index.php	
  
<?php	
  
	
  	
  	
  	
  //	
  單⾏行式註解	
  
	
  	
  	
  	
  $var	
  =	
  'hello,	
  world';	
  //	
  ⾏行內式註解	
  
	
  	
  	
  	
  #	
  也可以⽤用	
  #	
  號	
  
	
  	
  	
  	
  /*	
  
	
  	
  	
  	
  	
  *	
  多⾏行區塊式註解	
  
	
  	
  	
  	
  	
  */	
  
	
  	
  	
  	
  
	
  	
  	
  	
  /*	
  想這樣使⽤用也可以	
  */	
  
?>
宣告變數
• 所有的 PHP 變數宣告皆以 $ 字號做為開頭
• 變數名稱以 _ 和 a-­‐z 及 A-­‐Z 開頭 (不可以數字開頭)
• 變數以 = 賦予其值
• PHP 是弱型別,賦予值時會⾃自動判別資料型別
//	
  4-­‐variables/index.php	
  
//	
  宣告變數	
  
$var	
  =	
  'Bob';	
  	
  //	
  合法,⼩小寫開頭	
  
$Var	
  =	
  'Joe';	
  	
  //	
  合法,⼤大寫開頭	
  
$_4site	
  =	
  'hello,	
  world';	
  //	
  合法,底線開頭	
  
$4site	
  =	
  'hello,	
  world';	
  	
  //	
  不合法,數字開頭
資料型別
• 整數 (integer)
• 浮點數 (float)
• 布林值 (boolean)
• 字串 (string)
//	
  5-­‐types/index.php	
  
$int	
  =	
  1234;	
  
$int	
  =	
  -­‐1234;	
  
$float	
  =	
  1234.56;	
  
$boolean	
  =	
  true;	
  
$string	
  =	
  'hello,	
  world';
資料型別
• 陣列 (array)
• 物件 (object)
• 資源 (resource)
//	
  5-­‐types/index.php	
  
$array53	
  =	
  array(1,	
  2,	
  3,	
  4,	
  5);	
  //	
  5.3	
  以前的陣列寫法	
  
$array54	
  =	
  [	
  //	
  5.4	
  以後的陣列簡寫	
  
	
  	
  	
  ['id'	
  =>	
  1,	
  'name'	
  =>	
  'Tom'],	
  
	
  	
  	
  ['id'	
  =>	
  2,	
  'name'	
  =>	
  'Simon'],	
  
];	
  
$object	
  =	
  new	
  MyObj;	
  
$object-­‐>method();	
  
//	
  $handle	
  即為⼀一種	
  resource	
  
$handle	
  =	
  fopen("/*	
  file	
  path	
  */",	
  "r");
弱型別與強制轉型
• PHP 的變數是弱型別,在宣告時不需指定型別,直
譯器會⾃自動判定後給予型別。在操作過程中若有需
要也會⾃自動轉型
• 若需要強制變更變數的型別,可以⽤用語法強制轉型
//	
  6-­‐weaktypes-­‐and-­‐casts/index.php	
  
$var	
  =	
  "0";	
  //	
  $var	
  是字串	
  0	
  
$var	
  =	
  $var	
  +	
  2;	
  //	
  $var	
  變成整數	
  2	
  
$var	
  =	
  $var	
  +	
  1.3	
  //	
  $var	
  變成浮點數	
  3.3	
  
$cast	
  =	
  (int)	
  $var;	
  //	
  強制轉型成整數	
  
$cast	
  =	
  (bool)	
  $var;	
  //	
  強制轉型成布林值	
  
$cast	
  =	
  (float)	
  $var;	
  //	
  強制轉型成浮點數	
  
$cast	
  =	
  (string)	
  $var;	
  //	
  強制轉型成字串	
  
$cast	
  =	
  (array)	
  $var;	
  //	
  強制轉型成陣列	
  
$cast	
  =	
  (object)	
  $var;	
  //	
  強制轉型成物件
內建函式 (functions)
• PHP 本⾝身內建了⼤大量的函式可直接呼叫使⽤用
• 可以在官⽅方⽂文件上查詢這些函式的使⽤用⽅方式
//	
  7-­‐buildin-­‐functions/index.php	
  
//	
  http://php.net/manual/en/function.strlen.php	
  
$string	
  =	
  "hello,	
  world";	
  
echo	
  strlen($string);	
  
//	
  http://php.net/manual/en/function.str-­‐replace.php	
  
$search	
  =	
  'world';	
  
$replace	
  =	
  'dolly';	
  
echo	
  str_replace($search,	
  $replace,	
  $string);
⾃自定函式
• PHP 可以⾃自⾏行定義函式,包括函式名稱、參數、參
數預設值、函式回傳
• 呼叫時,直接使⽤用函式名稱加上指定參數並以括號
包起來即可
//	
  8-­‐userdefined-­‐functions/index.php	
  
//	
  定義函式	
  
function	
  greeting($name	
  =	
  'Simon',	
  $words	
  =	
  ['Hi'])	
  {	
  
	
  	
  	
  	
  $index	
  =	
  rand(0,	
  count($words)	
  -­‐	
  1);	
  
	
  	
  	
  	
  $sentence	
  =	
  $words[$index].',	
  '.$name;	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  return	
  $sentence;	
  
}	
  
//	
  呼叫函式	
  
echo	
  greeting('Tom',	
  ['Hola',	
  'Hello',	
  'Good	
  Morning']);
算數操作⼦子
• 加、減、乘、除
//	
  9-­‐operators/index.php	
  
$x	
  =	
  10;	
  
$y	
  =	
  2;	
  
$result	
  =	
  $x	
  +	
  $y;	
  
echo	
  $result;	
  
$result	
  =	
  $x	
  -­‐	
  $y;	
  
echo	
  $result;	
  
$result	
  =	
  $x	
  *	
  $y;	
  
echo	
  $result;	
  
$result	
  =	
  $x	
  /	
  $y;	
  
echo	
  $result;
賦值操作/遞增遞減
• 算數操作與賦值同時進⾏行
• 遞增、遞減
//	
  9-­‐operators/index.php	
  
$x	
  =	
  20;	
  
$x	
  +=	
  2;	
  
$x	
  -­‐=	
  6;	
  
$x	
  *=	
  5;	
  
$x	
  /=	
  2;	
  
$x	
  .=	
  'txt';
//	
  9-­‐operators/index.php	
  
$x	
  =	
  20;	
  
$x++;	
  
$x-­‐-­‐;
邏輯判斷
• if
• elseif
• else
//	
  conditions-­‐1.php	
  
$x	
  =	
  21;	
  
if	
  ($x	
  <	
  20)	
  {	
  
	
  	
  	
  echo	
  '⼩小於	
  20';	
  
}	
  elseif	
  ($x	
  >	
  20)	
  {	
  
	
  	
  	
  	
  echo	
  '⼤大於	
  20’;	
  
}	
  else	
  {	
  
	
  	
  	
  	
  echo	
  '等於	
  20’;	
  
}
⽐比較運算⼦子
• >、<、>=、<=
• ==、!=
• !、and (&&)、or (||)
//	
  11–comparisions/index.php	
  
$x	
  =	
  20;	
  
var_dump($x	
  >	
  20);	
  
var_dump($x	
  >=	
  20);	
  
var_dump($x	
  <	
  20);	
  
var_dump($x	
  <=	
  20);	
  
var_dump($x	
  ==	
  20);	
  
var_dump($x	
  !=	
  20);
$int	
  =	
  22;	
  
$bool	
  =	
  false;	
  
var_dump(!$bool);	
  
var_dump($int	
  >	
  0	
  &&	
  $int	
  <	
  50);	
  
var_dump($int	
  >	
  0	
  ||	
  $int	
  <	
  20);
迴圈 (loop)
• for
• foreach
//	
  12-­‐loops/index.php	
  
for	
  ($i	
  =	
  0;	
  $i	
  <	
  10;	
  $i++)	
  {	
  
	
  	
  	
  	
  echo	
  $i;	
  
}
//	
  12-­‐loops/index.php	
  
foreach	
  (range(1,	
  10)	
  as	
  $index	
  =>	
  $value)	
  {	
  
	
  	
  	
  	
  echo	
  'index:	
  '.$index.',	
  value:	
  '.$value;	
  
}
引⼊入
• require
• include
//	
  13-­‐require-­‐and-­‐include/index.php	
  
require	
  'require-­‐sample.php';	
  
include	
  'include-­‐sample.php';
PHP	
  物件導向
物件導向程式設計
• 雖然使⽤用 PHP 內建的函式就可以寫出動態網站,但
若使⽤用物件導向程式設計 (OOP),可以讓⼤大量網站
的程式碼更加有組織、讓更多⼈人可以參與並讓程式
碼重複利⽤用
• 物件導向程式設計的價值在於封裝 (encapsulation)。
它讓我們把⼀一系列有關係的變數、函式等集合成⼀一
個⽅方便操作的物件,除了⽅方便使⽤用外,也可以讓程
式碼易於維護和擴充
定義物件//	
  14-­‐defined-­‐object/Animal.php	
  
class	
  Animal	
  //	
  物件名稱	
  
{	
  
	
   public	
  $name;	
  	
  //	
  物件屬性	
  
	
   protected	
  $axis;	
  
	
   public	
  function	
  __construct($name)	
  //	
  建構式	
  
	
   {	
  
	
   	
   $this-­‐>name	
  =	
  $name;	
  
	
   	
   $this-­‐>axis	
  =	
  ['x'	
  =>	
  0,	
  'y'	
  =>	
  0];	
  
	
   }	
  
	
   public	
  function	
  move($x,	
  $y)	
  //	
  物件⽅方法	
  
	
   {	
  
	
   	
   $this-­‐>axis['x']	
  +=	
  $x;	
  
	
   	
   $this-­‐>axis['y']	
  +=	
  $y;	
  
	
   	
   return	
  $this-­‐>axis;	
  
	
   }	
  
}
實體化並使⽤用它
• 物件定義只是⼀一個藍圖,要使⽤用它之前,需要先實
體化並儲存在變數內,接著就可以使⽤用物件本⾝身的
所有功能
• 要實體化⼀一個物件要⽤用 new 關鍵字
• 要存取物件本⾝身的屬性或⽅方法時,要⽤用 -­‐> 語法
//	
  15-­‐instantiate/index.php	
  
$myPet	
  =	
  new	
  Animal('Lucky');	
  
$name	
  =	
  $myPet-­‐>name;	
  
$axis	
  =	
  $myPet-­‐>move(10,	
  20);	
  
echo	
  'My	
  pet	
  is	
  '.$name;	
  
echo	
  'It	
  axis	
  is	
  ('.$axis['x'].',	
  '.$axis['y'].')';
OOP 術語
• Object (物件) - 類⽐比於現實⽣生活中的⼀一個東⻄西
• Class (類別) - 創造物件的藍圖定義
• Instantiate (實體化) - 依照 Class 實做出物件的過程
• Property (屬性) - 物件裡的變數
• Method (⽅方法) - 物件裡的函式
• Constructor (建構式) - 在實體化物件時會執⾏行的⼀一
段函式,可⽤用於物件初始化的設定。使⽤用 PHP 的魔
術⽅方法 (magic method) __construct() 定義
繼承
• 在實作上為了讓類別之間具有親屬關係,並讓物件可
依需求擴充其功能,所以在物件導向程式設計裡很重
要的語法就是繼承。
• 簡⽽而⾔言之就是⼦子類別可以繼承 (擴充 extends) ⼀一個
⽗父類別,透過繼承,⼦子類別就⾃自動具有所有⽗父類別的
屬性及⽅方法
Animal
+	
  name:	
  string	
  
+	
  axis:	
  array
+	
  move():	
  array Cat
Dog
+	
  move():	
  array
Cat
+	
  move():	
  array
extendsextends
繼承範例
//	
  16-­‐inheritance/Dog.php	
  
class	
  Dog	
  extends	
  Animal	
  
{	
  
	
   //	
  overwrite	
  
	
   public	
  function	
  move($x,	
  $y)	
  
	
   {	
  
	
   	
   $x	
  =	
  $x	
  +	
  20;	
  
	
   	
   $y	
  =	
  $y	
  +	
  20;	
  
	
   	
   $this-­‐>axis['x']	
  +=	
  $x;	
  
	
   	
   $this-­‐>axis['y']	
  +=	
  $y;	
  
	
   	
   return	
  $this-­‐>axis;	
  
	
   }	
  
}
//	
  16-­‐inheritance/Cat.php	
  
class	
  Cat	
  extends	
  Animal	
  
{	
  
	
   //	
  overwrite	
  
	
   public	
  function	
  move($x,	
  $y)	
  
	
   {	
  
	
   	
   $x	
  =	
  $x	
  -­‐	
  10;	
  
	
   	
   $y	
  =	
  $y	
  -­‐	
  10;	
  
	
   	
   $this-­‐>axis['x']	
  +=	
  $x;	
  
	
   	
   $this-­‐>axis['y']	
  +=	
  $y;	
  
	
   	
   return	
  $this-­‐>axis;	
  
	
   }	
  
}
visibility (可⾒見度)
• 物件內的屬性和⽅方法都可以設定其 visibility,由此管
制屬性和⽅方法是否能從外部或⼦子代來變更?
• visibility 的設定共有三種:
- public:該屬性和⽅方法可從外部使⽤用
- private:該屬性和⽅方法只有本⾝身可存取,外部或
⼦子代都無法使⽤用
- protected:與 private 類似,但其⼦子代可以覆寫
選擇正確的 visibility
可從外部使⽤用?
拒絕⼦子代使⽤用?
public
private
protected
是
是
否
否
建⽴立 getter 及 setter
• 透過 public 讓外界直接改變物件的屬性太過⾃自由,
⽐比較好的作法是將屬性設定為 protected 後,建⽴立
getter 及 setter 來存取它們
• 這樣做除了可以管控存取外,也可以在取值和設值
的過程中依需求多做⼀一些事 (Log、變更格式、驗證
…等)
getter 及 setter 範例
//	
  17-­‐getter-­‐and-­‐setter/Animal.php	
  
class	
  Animal	
  
{	
  
	
   protected	
  $name;	
  
	
   /*	
  略	
  */	
  
	
   //	
  getter	
  
	
   public	
  function	
  getName()	
  
	
   {	
  
	
   	
   return	
  $this-­‐>name;	
  
	
   }	
  
	
   //	
  setter	
  
	
   public	
  function	
  setName($name)	
  
	
   {	
  
	
   	
   $this-­‐>name	
  =	
  $name;	
  
	
   	
   return	
  true;	
  
	
   }	
  
}
//	
  17-­‐getter-­‐and-­‐setter/	
  
//	
  index.php	
  
$animal	
  =	
  new	
  Animal;	
  
$animal-­‐>setName('Lucky');	
  
echo	
  $animal-­‐>getName();
靜態屬性和⽅方法
• 在物件還沒有實體化之前,所有的屬性和⽅方法都是
不可使⽤用的
• 但若在定義時就設定該屬性或⽅方法為 static 的話,
則可以在未實體化前就使⽤用
• 使⽤用時要⽤用 ::	
  來取⽤用
//	
  18-­‐static/Dog.php	
  
class	
  Dog	
  
{	
  
	
  	
  	
  	
  //	
  略	
  
	
   public	
  static	
  function	
  bark()	
  
	
   {	
  
	
   	
   echo	
  'wang	
  wang';	
  
	
  	
  	
  	
  }	
  
}
//	
  18-­‐static/index.php	
  
//	
  使⽤用靜態⽅方法	
  
Dog::bark();
介⾯面
• 雖然物件之間可以透過繼承取得⽗父類別能⼒力的實作,
但在某些狀況下,能⼒力的實作其實不符合物件繼承
的概念
• 介⾯面是描述物件能⼒力的⼀一種⽅方式,其只指定了⽅方法
的名稱和參數,但不實作內容
• 在類別宣告的時候,需要使⽤用 implements 關鍵字
來宣告實作介⾯面,⽽而⼀一旦類別實作了該介⾯面,就⼀一
定要實作該介⾯面定義的⽅方法內容
• 透過介⾯面,讓物件在實作上有了合約 (contract) 的締
結,讓物件導向程式設計在實作上更為嚴謹
介⾯面範例
//	
  19-­‐interface/Swimmable.php	
  
interface	
  Swimmable	
  
{	
  
	
   public	
  function	
  swim();	
  
}	
  
//	
  19-­‐interface/Dog.php	
  
class	
  Dog	
  extends	
  Animal	
  implements	
  Swimmable	
  
{	
  
	
   public	
  function	
  swim()	
  
	
   {	
  
	
   	
   echo	
  'swimming...';	
  
	
   }	
  
}	
  
//	
  19-­‐interface/index.php	
  
$dog	
  =	
  new	
  Dog;	
  
$dog-­‐>swim();
型別提⽰示 (Type Hint)
• 雖然 PHP 本⾝身是弱型別程式語⾔言,但 function 接受
參數時,我們可以透過 type hinting 的功能,要求傳
⼊入的參數⼀一定是某種型別或物件,這在物件導向程
式設計裡特別有⽤用
• 可以做型別提⽰示的只有 array、object、callable
//	
  20-­‐typehinting/Human.php	
  
public	
  function	
  greeting(array	
  $words	
  =	
  null)	
  {	
  
	
  	
  	
  	
  $speaks	
  =	
  ($words)?	
  $words	
  :	
  $this-­‐>words;	
  
	
  	
  	
  	
  $index	
  =	
  rand(0,	
  count($speaks)	
  -­‐	
  1);	
  
	
  	
  	
  	
  $sentence	
  =	
  $this-­‐>name.'	
  say	
  '.$speaks[$index].'	
  to	
  you!';	
  
	
  	
  	
  	
  return	
  $sentence;	
  
}	
  
//	
  20-­‐typehinting/index.php	
  
echo	
  $tom-­‐>greeting(['Hi',	
  'Hello',	
  'Good	
  Morning']);
Polymorphism (多型)
• PHP 的物件導向⽀支援 Polymorphism 的設計,也就是
說⼦子代也可以被識別為具有⽗父代或介⾯面特徵
• 因此在物件⽅方法做 type hinting 時,可以指定介⾯面或
⽗父類別,即便傳⼊入的是⼦子類別的實作或擴充,⼀一樣
都會通過
• 在這物件導向程式設計裡⾮非常有⽤用,讓物件間僅需
依賴介⾯面實作,就可以確保取得物件的能⼒力,⽽而不
需要知道物件本⾝身的實作
method chain (⽅方法鏈結)
• 在實作物件⽅方法時,若我們在⽅方法內回傳物件本⾝身,
就可以實作出 Fluent Interface (可以在許多 PHP 元件上看到這
種⽤用法)
//	
  21-­‐method-­‐chain/Dog.php	
  
class	
  Dog	
  
{	
  
	
  	
  	
  	
  //	
  略	
  
	
   public	
  function	
  bark()	
  
	
   {	
  
	
   	
   echo	
  'wang	
  wang';	
  
	
   	
   return	
  $this;	
  
	
  	
  	
  	
  }	
  
	
   public	
  function	
  swim()	
  
	
   {	
  
	
   	
   echo	
  'swimming...';	
  
	
   	
   return	
  $this;	
  
	
  	
  	
  	
  }	
  
}
//	
  21-­‐method-­‐chain/	
  
//	
  index.php	
  
$dog	
  =	
  new	
  Dog;	
  
$dog-­‐>bark()-­‐>swim();
abstract 類別
• 當物件被宣告為 abstract 時,該物件本⾝身就不能
被實體化,⽽而⼀一定是被拿來做繼承
• 可以⽤用來做 Base Class 使⽤用,我們會在 Laravel 的
BaseController 看到這種設計
//	
  IlluminateRoutingController.php	
  
abstract	
  class	
  Controller	
  
{	
  
	
   protected	
  $middleware	
  =	
  [];	
  
	
   /*	
  略	
  */	
  
	
  	
  	
  	
  public	
  function	
  middleware($middleware,	
  array	
  $options	
  =	
  [])	
  
	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  $this-­‐>middleware[$middleware]	
  =	
  $options;	
  
	
  	
  	
  	
  }	
  
	
   /*	
  略	
  */	
  
}
PHP	
  5.3+	
  新語法
namespace (命名空間)
• 在撰寫物件時,最常碰到的⼀一個狀況就是:萬⼀一我
的物件名稱跟別⼈人重複時,該怎麼辦?
• namespace 就是為了解決這個問題⽽而存在,在定義類
別時,可將類別放在命名空間內
• 在使⽤用 namespace 時,要特別注意⺫⽬目前所在的
namespace 為何?
- 可以透過 全名 實體化到該物件
- 可以先⽤用 use 關鍵字宣告
定義 namespace
//	
  23-­‐namespace/app/Helpers/StringHelper.php	
  
<?php	
  
namespace	
  AppHelpers;	
  
class	
  StringHelper	
  
{	
  
	
   public	
  function	
  sanitize($string)	
  
	
   {	
  
	
   	
   $result	
  =	
  trim($string);	
  
	
   	
   $result	
  =	
  strip_tags($result);	
  
	
   	
   return	
  htmlentities($result,	
  ENT_QUOTES,	
  'UTF-­‐8');	
  
	
   }	
  
}
使⽤用 namespace 的物件
//	
  23-­‐namespace/index.php	
  
<?php	
  
require	
  'app/Helpers/StringHelper.php';	
  
$string	
  =	
  '	
  	
  	
  hello	
  <h1>world</h1>	
  	
  	
  ';	
  
$helper	
  =	
  new	
  AppHelpersStringHelper;	
  
echo	
  $helper-­‐>sanitize($string);
//	
  23-­‐namespace/index.php	
  
<?php	
  
require	
  'app/Helpers/StringHelper.php';	
  
use	
  AppHelpersStringHelper;	
  
$string	
  =	
  '	
  	
  	
  hello	
  <h1>world</h1>	
  	
  	
  ';	
  
$helper	
  =	
  new	
  StringHelper;	
  
echo	
  $helper-­‐>sanitize($string);
namespace alias
• 若覺得 Class 名稱太⻑⾧長、或是遇到兩個⼀一樣名稱的
Class 時,可以使⽤用 alias (別名) 來做區隔
//	
  23-­‐namespace/index.php	
  
<?php	
  
require	
  'app/Helpers/StringHelper.php';	
  
use	
  AppHelpersStringHelper	
  as	
  S;	
  
$string	
  =	
  '	
  	
  	
  hello	
  <h1>world</h1>	
  	
  	
  ';	
  
$helper	
  =	
  new	
  S;	
  
echo	
  $helper-­‐>sanitize($string);
Trait
• Interface 解決了不同類別之間共享能⼒力的問題,但
Interface 無法定義實作內容。若兩個類別的實作內
容相同時,仍有部份的程式碼是重覆的
• Trait 可以把它想像成請 PHP Interpreter 幫我們做程
式碼複製貼上的動作,讓不同類別間的實作內容可
以共⽤用
• 但要特別注意的是,PHP Interpreter 僅幫我們做複
製貼上的動作,並不嚴格的管理 Class 裡的實作是否
符合 Trait 裡假定,若中間有誤是會讓程式出錯的
• 在 Laravel 裡,SoftDelete 就是⽤用 Trait 來實作
Trait 範例
//	
  24-­‐trait/Swimmable.php	
  
trait	
  Swimmable	
  
{	
  
	
   public	
  function	
  swim()	
  
	
   {	
  
	
   	
   echo	
  'swimming...';	
  
	
   }	
  
}	
  
//	
  24-­‐trait/Dog.php	
  
class	
  Dog	
  extends	
  Animal	
  
{	
  
	
   use	
  Swimmable;	
  
}	
  
//	
  24-­‐trait/index.php	
  
$dog	
  =	
  new	
  Dog;	
  
$dog-­‐>swim();
callbacks/callables
• 在看 PHP 官⽅方⽂文件時,不知道有沒有注意過有些函
式的參數是 $callback?
• 透過 anonymous functions,讓我們可以直接將函式
寫成 callback,不必在另外定義函式
//	
  25-­‐callback/index.php	
  
//	
  ⼤大部份的範例	
  
function	
  cube($n)	
  {	
  
	
  	
  	
  	
  return	
  ($n	
  *	
  $n	
  *	
  $n);	
  
}	
  
$result	
  =	
  array_map("cube",	
  [	
  
	
  	
  	
  	
  1,	
  2,	
  3,	
  4,	
  5	
  
]);
//	
  其實可以直接寫成這樣	
  
$r	
  =	
  array_map(function($n)	
  {	
  
	
  	
  	
  	
  return	
  ($n	
  *	
  $n	
  *	
  $n);	
  
},	
  [1,	
  2,	
  3,	
  4,	
  5]);
傳遞參數⾄至 callback 內
• 使⽤用 anonymous functions 時,函式內部是運作在其
⾃自⼰己的空間內,換句話說,函式本⾝身無法存取外部
變數的。但可以透過 use 關鍵字將變數傳遞⾄至函式
內部使⽤用
//	
  25-­‐callback/index.php	
  
$base	
  =	
  2;	
  
$result	
  =	
  array_map(function($n)	
  use	
  ($base)	
  {	
  
	
  	
  	
  	
  return	
  $n	
  *	
  $base;	
  
},	
  [1,	
  2,	
  3]);	
  
//	
  $result	
  =	
  [2,	
  4,	
  6];
PSR 規範
• PHP 界充滿了各式各樣的組件與框架。但在早期,
所謂的現代 PHP ⽣生態系還沒⽣生成前,舊版框架在開
發上的作法常常讓開發者無法容易地分享程式碼
• 2009 年在 php | tek 研討會上,數個 PHP 框架的開發
者意識到這樣的問題,因此組成了 PHP-FIG 這樣的
組織,⺫⽬目的在於讓框架之間能夠更有效的溝通與交
流
• PSR 就是 PHP-FIG 提出的建議規範,依照編號⺫⽬目前
有 PSR-1、PSR-2、PSR-3、PSR-4,每⼀一個建議都是
為了解決⼀一些常⾒見的特定問題
PSR-4 與 autoload
• 以往在使⽤用類別前,都要透過 require、
require_once、include、include_once 等⽅方式
將檔案引⽤用後才可使⽤用,造成檔案的開頭會有⼀一堆引
⼊入的語法
• 為了解決這個問題,PHP 提供 __autoload() 及
spl_autoload_register() 可以讓開發者⾃自⾏行定義
載⼊入邏輯
• 但若每個開發者的載⼊入邏輯都不同時,對於元件的使
⽤用者⽽而⾔言也是⼀一樣的困擾。因此 PSR-4 規範裡定義了
⼀一套 namespace 與資料夾放置的統⼀一作法,只要元件
開發者依循其規範,所有的使⽤用者就可以透過
Composer 處理⾃自動載⼊入的問題
單元總結
• 在這個單元裡我們學到了些什麼?
- PHP 基礎觀念
- 物件導向語法
- PHP 5.3+ 新語法及功能
推薦閱讀
http://www.sitepoint.com/
store/php-­‐master-­‐write-­‐
cutting-­‐edge-­‐code/
http://shop.oreilly.com/
product/0636920033868.do	
  
Q & A
歡迎提問討論

More Related Content

What's hot

realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係Yoshio Hanawa
 
Route 路由控制
Route 路由控制Route 路由控制
Route 路由控制Shengyou Fan
 
Spring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
Spring I/O 2012: Natural Templating in Spring MVC with ThymeleafSpring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
Spring I/O 2012: Natural Templating in Spring MVC with ThymeleafThymeleaf
 
Angular Advanced Routing
Angular Advanced RoutingAngular Advanced Routing
Angular Advanced RoutingLaurent Duveau
 
Introduction to laravel framework
Introduction to laravel frameworkIntroduction to laravel framework
Introduction to laravel frameworkAhmad Fatoni
 
使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後Shengyou Fan
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Laravel presentation
Laravel presentationLaravel presentation
Laravel presentationToufiq Mahmud
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
Spring Framework - Spring Security
Spring Framework - Spring SecuritySpring Framework - Spring Security
Spring Framework - Spring SecurityDzmitry Naskou
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
카카오톡의 서버사이드 코틀린
카카오톡의 서버사이드 코틀린카카오톡의 서버사이드 코틀린
카카오톡의 서버사이드 코틀린if kakao
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 
LinkedList vs Arraylist- an in depth look at java.util.LinkedList
LinkedList vs Arraylist- an in depth look at java.util.LinkedListLinkedList vs Arraylist- an in depth look at java.util.LinkedList
LinkedList vs Arraylist- an in depth look at java.util.LinkedListMarcus Biel
 
PHPUnit 入門介紹
PHPUnit 入門介紹PHPUnit 入門介紹
PHPUnit 入門介紹Jace Ju
 
Lecture 2_ Intro to laravel.pptx
Lecture 2_ Intro to laravel.pptxLecture 2_ Intro to laravel.pptx
Lecture 2_ Intro to laravel.pptxSaziaRahman
 
Php and threads ZTS
Php and threads ZTSPhp and threads ZTS
Php and threads ZTSjulien pauli
 

What's hot (20)

realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
 
Route 路由控制
Route 路由控制Route 路由控制
Route 路由控制
 
Spring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
Spring I/O 2012: Natural Templating in Spring MVC with ThymeleafSpring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
Spring I/O 2012: Natural Templating in Spring MVC with Thymeleaf
 
Angular Advanced Routing
Angular Advanced RoutingAngular Advanced Routing
Angular Advanced Routing
 
laravel.pptx
laravel.pptxlaravel.pptx
laravel.pptx
 
Introduction to laravel framework
Introduction to laravel frameworkIntroduction to laravel framework
Introduction to laravel framework
 
使用 laravel 的前與後
使用 laravel 的前與後使用 laravel 的前與後
使用 laravel 的前與後
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Laravel presentation
Laravel presentationLaravel presentation
Laravel presentation
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
Why Laravel?
Why Laravel?Why Laravel?
Why Laravel?
 
Spring Framework - Spring Security
Spring Framework - Spring SecuritySpring Framework - Spring Security
Spring Framework - Spring Security
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
JQuery UI
JQuery UIJQuery UI
JQuery UI
 
카카오톡의 서버사이드 코틀린
카카오톡의 서버사이드 코틀린카카오톡의 서버사이드 코틀린
카카오톡의 서버사이드 코틀린
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
LinkedList vs Arraylist- an in depth look at java.util.LinkedList
LinkedList vs Arraylist- an in depth look at java.util.LinkedListLinkedList vs Arraylist- an in depth look at java.util.LinkedList
LinkedList vs Arraylist- an in depth look at java.util.LinkedList
 
PHPUnit 入門介紹
PHPUnit 入門介紹PHPUnit 入門介紹
PHPUnit 入門介紹
 
Lecture 2_ Intro to laravel.pptx
Lecture 2_ Intro to laravel.pptxLecture 2_ Intro to laravel.pptx
Lecture 2_ Intro to laravel.pptx
 
Php and threads ZTS
Php and threads ZTSPhp and threads ZTS
Php and threads ZTS
 

Viewers also liked

Composer 套件管理
Composer 套件管理Composer 套件管理
Composer 套件管理Shengyou Fan
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用Shengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作Shengyou Fan
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 SeedingShengyou Fan
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合Shengyou Fan
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定Shengyou Fan
 

Viewers also liked (20)

Composer 套件管理
Composer 套件管理Composer 套件管理
Composer 套件管理
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
Migrations 與 Schema 操作
Migrations 與 Schema 操作Migrations 與 Schema 操作
Migrations 與 Schema 操作
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 Seeding
 
工作坊簡介
工作坊簡介工作坊簡介
工作坊簡介
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
整合 Open ID
整合 Open ID整合 Open ID
整合 Open ID
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
使用者認證
使用者認證使用者認證
使用者認證
 
工作坊總結
工作坊總結工作坊總結
工作坊總結
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
課程簡介
課程簡介課程簡介
課程簡介
 
Model & Seeding整合
Model & Seeding整合Model & Seeding整合
Model & Seeding整合
 
使用者認證
使用者認證使用者認證
使用者認證
 
Route 機制
Route 機制Route 機制
Route 機制
 
專案啟動與設定
專案啟動與設定專案啟動與設定
專案啟動與設定
 
CRUD 綜合應用
CRUD 綜合應用CRUD 綜合應用
CRUD 綜合應用
 

Similar to PHP 語法基礎與物件導向

OpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IOpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IHung-yu Lin
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學Bo-Yi Wu
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘Liu Allen
 
Php for fe
Php for fePhp for fe
Php for fejay li
 
Maintainable PHP Source Code
Maintainable PHP Source CodeMaintainable PHP Source Code
Maintainable PHP Source CodeBo-Yi Wu
 
Php设计模式介绍
Php设计模式介绍Php设计模式介绍
Php设计模式介绍cyf5513
 
Migrations 與 Schema操作
Migrations 與 Schema操作Migrations 與 Schema操作
Migrations 與 Schema操作Shengyou Fan
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定Shengyou Fan
 
OpenResty/Lua Practical Experience
OpenResty/Lua Practical ExperienceOpenResty/Lua Practical Experience
OpenResty/Lua Practical ExperienceHo Kim
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作Shengyou Fan
 
部分PHP问题总结[转贴]
部分PHP问题总结[转贴]部分PHP问题总结[转贴]
部分PHP问题总结[转贴]wensheng wei
 
cfm to php training
cfm to php training cfm to php training
cfm to php training Chonpin HSU
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 SeedingShengyou Fan
 
Internal php and gdb php core
Internal php and gdb php coreInternal php and gdb php core
Internal php and gdb php corealpha86
 
Discuz技术交流
Discuz技术交流Discuz技术交流
Discuz技术交流pigso
 
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務Mu-Fan Teng
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎Shengyou Fan
 

Similar to PHP 語法基礎與物件導向 (20)

OpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part IOpenWebSchool - 02 - PHP Part I
OpenWebSchool - 02 - PHP Part I
 
PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
 
Php for fe
Php for fePhp for fe
Php for fe
 
Maintainable PHP Source Code
Maintainable PHP Source CodeMaintainable PHP Source Code
Maintainable PHP Source Code
 
Php设计模式介绍
Php设计模式介绍Php设计模式介绍
Php设计模式介绍
 
PHP
PHPPHP
PHP
 
Eloquent ORM
Eloquent ORMEloquent ORM
Eloquent ORM
 
Migrations 與 Schema操作
Migrations 與 Schema操作Migrations 與 Schema操作
Migrations 與 Schema操作
 
專案啟動與環境設定
專案啟動與環境設定專案啟動與環境設定
專案啟動與環境設定
 
OpenResty/Lua Practical Experience
OpenResty/Lua Practical ExperienceOpenResty/Lua Practical Experience
OpenResty/Lua Practical Experience
 
Schema & Migration操作
Schema & Migration操作Schema & Migration操作
Schema & Migration操作
 
部分PHP问题总结[转贴]
部分PHP问题总结[转贴]部分PHP问题总结[转贴]
部分PHP问题总结[转贴]
 
cfm to php training
cfm to php training cfm to php training
cfm to php training
 
Model 設定與 Seeding
Model 設定與 SeedingModel 設定與 Seeding
Model 設定與 Seeding
 
Internal php and gdb php core
Internal php and gdb php coreInternal php and gdb php core
Internal php and gdb php core
 
Discuz技术交流
Discuz技术交流Discuz技术交流
Discuz技术交流
 
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
Mopcon2014 - 使用 Sinatra 結合 Ruby on Rails 輕鬆打造完整 Full Stack 網站加 API Service服務
 
CRUD 綜合運用
CRUD 綜合運用CRUD 綜合運用
CRUD 綜合運用
 
View 與 Blade 樣板引擎
View 與 Blade 樣板引擎View 與 Blade 樣板引擎
View 與 Blade 樣板引擎
 

More from Shengyou Fan

[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式Shengyou Fan
 
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...Shengyou Fan
 
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀Shengyou Fan
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能Shengyou Fan
 
How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023Shengyou Fan
 
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀Shengyou Fan
 
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台Shengyou Fan
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇Shengyou Fan
 
Using the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your DatabaseUsing the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your DatabaseShengyou Fan
 
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具Shengyou Fan
 
[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園Shengyou Fan
 
初探 Kotlin Multiplatform
初探 Kotlin Multiplatform初探 Kotlin Multiplatform
初探 Kotlin MultiplatformShengyou Fan
 
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率Shengyou Fan
 
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用Shengyou Fan
 
Composer 經典食譜
Composer 經典食譜Composer 經典食譜
Composer 經典食譜Shengyou Fan
 
老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具Shengyou Fan
 
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS AggregatorShengyou Fan
 
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON APIShengyou Fan
 
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin ServerlessShengyou Fan
 
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置Shengyou Fan
 

More from Shengyou Fan (20)

[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
 
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
[JCConf 2023] 從 Kotlin Multiplatform 到 Compose Multiplatform:在多平台間輕鬆共用業務邏輯與 U...
 
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
[Kotlin 讀書會第五梯次] 深入淺出 Kotlin 第一章導讀
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
 
How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023How I make a podcast website using serverless technology in 2023
How I make a podcast website using serverless technology in 2023
 
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
[Effective Kotlin 讀書會] 第八章 Efficient collection processing 導讀
 
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
[MOPCON 2022] 以 Kotlin Multiplatform 制霸全平台
 
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
[JCConf 2022] Compose for Desktop - 開發桌面軟體的新選擇
 
Using the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your DatabaseUsing the Exposed SQL Framework to Manage Your Database
Using the Exposed SQL Framework to Manage Your Database
 
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
 
[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園[COSCUP 2022] Kotlin Collection 遊樂園
[COSCUP 2022] Kotlin Collection 遊樂園
 
初探 Kotlin Multiplatform
初探 Kotlin Multiplatform初探 Kotlin Multiplatform
初探 Kotlin Multiplatform
 
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
簡化 JVM 上雲 - 透過 Azure Spring Cloud 提升開發、發佈及服務監控效率
 
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
以 Kotlin Multiplatform Mobile (KMM) 開發跨平台行動應用
 
Composer 經典食譜
Composer 經典食譜Composer 經典食譜
Composer 經典食譜
 
老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具老派浪漫:用 Kotlin 寫 Command Line 工具
老派浪漫:用 Kotlin 寫 Command Line 工具
 
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
[Kotlin Serverless 工作坊] 單元 4 - 實作 RSS Aggregator
 
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
[Kotlin Serverless 工作坊] 單元 3 - 實作 JSON API
 
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
[Kotlin Serverless 工作坊] 單元 2 - 簡介 Kotlin Serverless
 
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
[Kotlin Serverless 工作坊] 單元 1 - 開發環境建置
 

PHP 語法基礎與物件導向

  • 1. PHP 語法基礎與物件導向 范聖佑 Shengyou Fan 新北市樹林國⼩小 (2015/07/06) 適 ⽤用 5.1 版
  • 2. 單元主題 • 複習 PHP 基礎語法 • 複習物件導向觀念,及如何使⽤用 PHP 實作物件導向 程式設計 • PHP 5.3+ 新語法及功能介紹 本單元將以後續⼯工作坊 (PHP 5.3+ 及 Laravel 5.1) 會使⽤用到的語法為主,更多語 法詳細內容請參考 PHP 官⽅方⽂文件及 Laravel 官⽅方⽂文件。
  • 4. PHP • 於 1995 年由 Rasmus Lerdorf 創始,並以開放源始碼 釋出,⾄至今已 20 年 • Personal Home Page、Hypertext Preprocessor • ⼿手稿型程式語⾔言 (scripting language) • 以直譯器 (interpreter) 動態編譯 • 動態、弱型別 (dynamic, weak typing) • 當前最新穩定版為 5.6.10 • PHP 7 預定於今年 10 ⽉月釋出
  • 5. 兩種執⾏行⽅方式 • ⼀一般常⾒見 PHP 的執⾏行⽅方式,都是將 *.php 檔案放置 在網⾴頁伺服器的⽂文件根⺫⽬目錄底下,再透過瀏覽器瀏 覽執⾏行後看結果 (在本⼯工作坊就是使⽤用 uwamp 這個整合包) • 由於 PHP 也有實作指令列模式,因此也可以在終端 機底下,以 php  {filename}.php 的⽅方式執⾏行某個 php 檔案,並在終端機底下看到執⾏行後的輸出結果 (在本⼯工作坊就是使⽤用 cmder 這個整合包) • 換句話說,其實可以拿 PHP 來寫指令列⼯工具 P.S 要特別注意的是,要使⽤用指令列模式,除了 PHP 本⾝身要掛載正確的設 定外,也要將 PHP 載⼊入⾄至終端機本⾝身運⾏行的 PATH 內
  • 6. 宣告 PHP 區塊 • PHP 天⽣生的特性就是⼀一個樣板語⾔言,可以混合 HTML 直接輸出成網⾴頁 • 純⽂文字檔案,以 .php 結尾 • 撰寫 PHP 語法時,必須將語法以 <?php  ?> 宣告 • 直譯式語⾔言,每⼀一句以分號 ; 結尾 <?php          //  php  語法寫在區塊內          $var  =  'some  strings';   ?>   <html>   <head>   <!-­‐-­‐  可以混合與  HTML  輸出  -­‐-­‐>
  • 7. 輸出語法 • PHP 常⾒見輸出變數內容的⽅方式有兩種 - 直接使⽤用 echo 語法 - 使⽤用 <?=  ?> 輸出變數 //  2-­‐declarations/index.php   <?php          $pageTitle  =  'Hello,  world';          $pageContent  'Long  long  time  ago...';   ?>   <html>   <head><!-­‐-­‐  略  -­‐-­‐></head>   <body>          <h1><?php  echo  $pageTitle;  ?></h1>          <p><?=$pageContent?></p>   </body>   </html>
  • 8. 註解 • PHP 的註解型式有兩種: • 單⾏行/⾏行內式 • 多⾏行/區塊式 //  3-­‐comments/index.php   <?php          //  單⾏行式註解          $var  =  'hello,  world';  //  ⾏行內式註解          #  也可以⽤用  #  號          /*            *  多⾏行區塊式註解            */                  /*  想這樣使⽤用也可以  */   ?>
  • 9. 宣告變數 • 所有的 PHP 變數宣告皆以 $ 字號做為開頭 • 變數名稱以 _ 和 a-­‐z 及 A-­‐Z 開頭 (不可以數字開頭) • 變數以 = 賦予其值 • PHP 是弱型別,賦予值時會⾃自動判別資料型別 //  4-­‐variables/index.php   //  宣告變數   $var  =  'Bob';    //  合法,⼩小寫開頭   $Var  =  'Joe';    //  合法,⼤大寫開頭   $_4site  =  'hello,  world';  //  合法,底線開頭   $4site  =  'hello,  world';    //  不合法,數字開頭
  • 10. 資料型別 • 整數 (integer) • 浮點數 (float) • 布林值 (boolean) • 字串 (string) //  5-­‐types/index.php   $int  =  1234;   $int  =  -­‐1234;   $float  =  1234.56;   $boolean  =  true;   $string  =  'hello,  world';
  • 11. 資料型別 • 陣列 (array) • 物件 (object) • 資源 (resource) //  5-­‐types/index.php   $array53  =  array(1,  2,  3,  4,  5);  //  5.3  以前的陣列寫法   $array54  =  [  //  5.4  以後的陣列簡寫        ['id'  =>  1,  'name'  =>  'Tom'],        ['id'  =>  2,  'name'  =>  'Simon'],   ];   $object  =  new  MyObj;   $object-­‐>method();   //  $handle  即為⼀一種  resource   $handle  =  fopen("/*  file  path  */",  "r");
  • 12. 弱型別與強制轉型 • PHP 的變數是弱型別,在宣告時不需指定型別,直 譯器會⾃自動判定後給予型別。在操作過程中若有需 要也會⾃自動轉型 • 若需要強制變更變數的型別,可以⽤用語法強制轉型 //  6-­‐weaktypes-­‐and-­‐casts/index.php   $var  =  "0";  //  $var  是字串  0   $var  =  $var  +  2;  //  $var  變成整數  2   $var  =  $var  +  1.3  //  $var  變成浮點數  3.3   $cast  =  (int)  $var;  //  強制轉型成整數   $cast  =  (bool)  $var;  //  強制轉型成布林值   $cast  =  (float)  $var;  //  強制轉型成浮點數   $cast  =  (string)  $var;  //  強制轉型成字串   $cast  =  (array)  $var;  //  強制轉型成陣列   $cast  =  (object)  $var;  //  強制轉型成物件
  • 13. 內建函式 (functions) • PHP 本⾝身內建了⼤大量的函式可直接呼叫使⽤用 • 可以在官⽅方⽂文件上查詢這些函式的使⽤用⽅方式 //  7-­‐buildin-­‐functions/index.php   //  http://php.net/manual/en/function.strlen.php   $string  =  "hello,  world";   echo  strlen($string);   //  http://php.net/manual/en/function.str-­‐replace.php   $search  =  'world';   $replace  =  'dolly';   echo  str_replace($search,  $replace,  $string);
  • 14. ⾃自定函式 • PHP 可以⾃自⾏行定義函式,包括函式名稱、參數、參 數預設值、函式回傳 • 呼叫時,直接使⽤用函式名稱加上指定參數並以括號 包起來即可 //  8-­‐userdefined-­‐functions/index.php   //  定義函式   function  greeting($name  =  'Simon',  $words  =  ['Hi'])  {          $index  =  rand(0,  count($words)  -­‐  1);          $sentence  =  $words[$index].',  '.$name;                    return  $sentence;   }   //  呼叫函式   echo  greeting('Tom',  ['Hola',  'Hello',  'Good  Morning']);
  • 15. 算數操作⼦子 • 加、減、乘、除 //  9-­‐operators/index.php   $x  =  10;   $y  =  2;   $result  =  $x  +  $y;   echo  $result;   $result  =  $x  -­‐  $y;   echo  $result;   $result  =  $x  *  $y;   echo  $result;   $result  =  $x  /  $y;   echo  $result;
  • 16. 賦值操作/遞增遞減 • 算數操作與賦值同時進⾏行 • 遞增、遞減 //  9-­‐operators/index.php   $x  =  20;   $x  +=  2;   $x  -­‐=  6;   $x  *=  5;   $x  /=  2;   $x  .=  'txt'; //  9-­‐operators/index.php   $x  =  20;   $x++;   $x-­‐-­‐;
  • 17. 邏輯判斷 • if • elseif • else //  conditions-­‐1.php   $x  =  21;   if  ($x  <  20)  {        echo  '⼩小於  20';   }  elseif  ($x  >  20)  {          echo  '⼤大於  20’;   }  else  {          echo  '等於  20’;   }
  • 18. ⽐比較運算⼦子 • >、<、>=、<= • ==、!= • !、and (&&)、or (||) //  11–comparisions/index.php   $x  =  20;   var_dump($x  >  20);   var_dump($x  >=  20);   var_dump($x  <  20);   var_dump($x  <=  20);   var_dump($x  ==  20);   var_dump($x  !=  20); $int  =  22;   $bool  =  false;   var_dump(!$bool);   var_dump($int  >  0  &&  $int  <  50);   var_dump($int  >  0  ||  $int  <  20);
  • 19. 迴圈 (loop) • for • foreach //  12-­‐loops/index.php   for  ($i  =  0;  $i  <  10;  $i++)  {          echo  $i;   } //  12-­‐loops/index.php   foreach  (range(1,  10)  as  $index  =>  $value)  {          echo  'index:  '.$index.',  value:  '.$value;   }
  • 20. 引⼊入 • require • include //  13-­‐require-­‐and-­‐include/index.php   require  'require-­‐sample.php';   include  'include-­‐sample.php';
  • 22. 物件導向程式設計 • 雖然使⽤用 PHP 內建的函式就可以寫出動態網站,但 若使⽤用物件導向程式設計 (OOP),可以讓⼤大量網站 的程式碼更加有組織、讓更多⼈人可以參與並讓程式 碼重複利⽤用 • 物件導向程式設計的價值在於封裝 (encapsulation)。 它讓我們把⼀一系列有關係的變數、函式等集合成⼀一 個⽅方便操作的物件,除了⽅方便使⽤用外,也可以讓程 式碼易於維護和擴充
  • 23. 定義物件//  14-­‐defined-­‐object/Animal.php   class  Animal  //  物件名稱   {     public  $name;    //  物件屬性     protected  $axis;     public  function  __construct($name)  //  建構式     {       $this-­‐>name  =  $name;       $this-­‐>axis  =  ['x'  =>  0,  'y'  =>  0];     }     public  function  move($x,  $y)  //  物件⽅方法     {       $this-­‐>axis['x']  +=  $x;       $this-­‐>axis['y']  +=  $y;       return  $this-­‐>axis;     }   }
  • 24. 實體化並使⽤用它 • 物件定義只是⼀一個藍圖,要使⽤用它之前,需要先實 體化並儲存在變數內,接著就可以使⽤用物件本⾝身的 所有功能 • 要實體化⼀一個物件要⽤用 new 關鍵字 • 要存取物件本⾝身的屬性或⽅方法時,要⽤用 -­‐> 語法 //  15-­‐instantiate/index.php   $myPet  =  new  Animal('Lucky');   $name  =  $myPet-­‐>name;   $axis  =  $myPet-­‐>move(10,  20);   echo  'My  pet  is  '.$name;   echo  'It  axis  is  ('.$axis['x'].',  '.$axis['y'].')';
  • 25. OOP 術語 • Object (物件) - 類⽐比於現實⽣生活中的⼀一個東⻄西 • Class (類別) - 創造物件的藍圖定義 • Instantiate (實體化) - 依照 Class 實做出物件的過程 • Property (屬性) - 物件裡的變數 • Method (⽅方法) - 物件裡的函式 • Constructor (建構式) - 在實體化物件時會執⾏行的⼀一 段函式,可⽤用於物件初始化的設定。使⽤用 PHP 的魔 術⽅方法 (magic method) __construct() 定義
  • 26. 繼承 • 在實作上為了讓類別之間具有親屬關係,並讓物件可 依需求擴充其功能,所以在物件導向程式設計裡很重 要的語法就是繼承。 • 簡⽽而⾔言之就是⼦子類別可以繼承 (擴充 extends) ⼀一個 ⽗父類別,透過繼承,⼦子類別就⾃自動具有所有⽗父類別的 屬性及⽅方法 Animal +  name:  string   +  axis:  array +  move():  array Cat Dog +  move():  array Cat +  move():  array extendsextends
  • 27. 繼承範例 //  16-­‐inheritance/Dog.php   class  Dog  extends  Animal   {     //  overwrite     public  function  move($x,  $y)     {       $x  =  $x  +  20;       $y  =  $y  +  20;       $this-­‐>axis['x']  +=  $x;       $this-­‐>axis['y']  +=  $y;       return  $this-­‐>axis;     }   } //  16-­‐inheritance/Cat.php   class  Cat  extends  Animal   {     //  overwrite     public  function  move($x,  $y)     {       $x  =  $x  -­‐  10;       $y  =  $y  -­‐  10;       $this-­‐>axis['x']  +=  $x;       $this-­‐>axis['y']  +=  $y;       return  $this-­‐>axis;     }   }
  • 28. visibility (可⾒見度) • 物件內的屬性和⽅方法都可以設定其 visibility,由此管 制屬性和⽅方法是否能從外部或⼦子代來變更? • visibility 的設定共有三種: - public:該屬性和⽅方法可從外部使⽤用 - private:該屬性和⽅方法只有本⾝身可存取,外部或 ⼦子代都無法使⽤用 - protected:與 private 類似,但其⼦子代可以覆寫
  • 30. 建⽴立 getter 及 setter • 透過 public 讓外界直接改變物件的屬性太過⾃自由, ⽐比較好的作法是將屬性設定為 protected 後,建⽴立 getter 及 setter 來存取它們 • 這樣做除了可以管控存取外,也可以在取值和設值 的過程中依需求多做⼀一些事 (Log、變更格式、驗證 …等)
  • 31. getter 及 setter 範例 //  17-­‐getter-­‐and-­‐setter/Animal.php   class  Animal   {     protected  $name;     /*  略  */     //  getter     public  function  getName()     {       return  $this-­‐>name;     }     //  setter     public  function  setName($name)     {       $this-­‐>name  =  $name;       return  true;     }   } //  17-­‐getter-­‐and-­‐setter/   //  index.php   $animal  =  new  Animal;   $animal-­‐>setName('Lucky');   echo  $animal-­‐>getName();
  • 32. 靜態屬性和⽅方法 • 在物件還沒有實體化之前,所有的屬性和⽅方法都是 不可使⽤用的 • 但若在定義時就設定該屬性或⽅方法為 static 的話, 則可以在未實體化前就使⽤用 • 使⽤用時要⽤用 ::  來取⽤用 //  18-­‐static/Dog.php   class  Dog   {          //  略     public  static  function  bark()     {       echo  'wang  wang';          }   } //  18-­‐static/index.php   //  使⽤用靜態⽅方法   Dog::bark();
  • 33. 介⾯面 • 雖然物件之間可以透過繼承取得⽗父類別能⼒力的實作, 但在某些狀況下,能⼒力的實作其實不符合物件繼承 的概念 • 介⾯面是描述物件能⼒力的⼀一種⽅方式,其只指定了⽅方法 的名稱和參數,但不實作內容 • 在類別宣告的時候,需要使⽤用 implements 關鍵字 來宣告實作介⾯面,⽽而⼀一旦類別實作了該介⾯面,就⼀一 定要實作該介⾯面定義的⽅方法內容 • 透過介⾯面,讓物件在實作上有了合約 (contract) 的締 結,讓物件導向程式設計在實作上更為嚴謹
  • 34. 介⾯面範例 //  19-­‐interface/Swimmable.php   interface  Swimmable   {     public  function  swim();   }   //  19-­‐interface/Dog.php   class  Dog  extends  Animal  implements  Swimmable   {     public  function  swim()     {       echo  'swimming...';     }   }   //  19-­‐interface/index.php   $dog  =  new  Dog;   $dog-­‐>swim();
  • 35. 型別提⽰示 (Type Hint) • 雖然 PHP 本⾝身是弱型別程式語⾔言,但 function 接受 參數時,我們可以透過 type hinting 的功能,要求傳 ⼊入的參數⼀一定是某種型別或物件,這在物件導向程 式設計裡特別有⽤用 • 可以做型別提⽰示的只有 array、object、callable //  20-­‐typehinting/Human.php   public  function  greeting(array  $words  =  null)  {          $speaks  =  ($words)?  $words  :  $this-­‐>words;          $index  =  rand(0,  count($speaks)  -­‐  1);          $sentence  =  $this-­‐>name.'  say  '.$speaks[$index].'  to  you!';          return  $sentence;   }   //  20-­‐typehinting/index.php   echo  $tom-­‐>greeting(['Hi',  'Hello',  'Good  Morning']);
  • 36. Polymorphism (多型) • PHP 的物件導向⽀支援 Polymorphism 的設計,也就是 說⼦子代也可以被識別為具有⽗父代或介⾯面特徵 • 因此在物件⽅方法做 type hinting 時,可以指定介⾯面或 ⽗父類別,即便傳⼊入的是⼦子類別的實作或擴充,⼀一樣 都會通過 • 在這物件導向程式設計裡⾮非常有⽤用,讓物件間僅需 依賴介⾯面實作,就可以確保取得物件的能⼒力,⽽而不 需要知道物件本⾝身的實作
  • 37. method chain (⽅方法鏈結) • 在實作物件⽅方法時,若我們在⽅方法內回傳物件本⾝身, 就可以實作出 Fluent Interface (可以在許多 PHP 元件上看到這 種⽤用法) //  21-­‐method-­‐chain/Dog.php   class  Dog   {          //  略     public  function  bark()     {       echo  'wang  wang';       return  $this;          }     public  function  swim()     {       echo  'swimming...';       return  $this;          }   } //  21-­‐method-­‐chain/   //  index.php   $dog  =  new  Dog;   $dog-­‐>bark()-­‐>swim();
  • 38. abstract 類別 • 當物件被宣告為 abstract 時,該物件本⾝身就不能 被實體化,⽽而⼀一定是被拿來做繼承 • 可以⽤用來做 Base Class 使⽤用,我們會在 Laravel 的 BaseController 看到這種設計 //  IlluminateRoutingController.php   abstract  class  Controller   {     protected  $middleware  =  [];     /*  略  */          public  function  middleware($middleware,  array  $options  =  [])          {                  $this-­‐>middleware[$middleware]  =  $options;          }     /*  略  */   }
  • 40. namespace (命名空間) • 在撰寫物件時,最常碰到的⼀一個狀況就是:萬⼀一我 的物件名稱跟別⼈人重複時,該怎麼辦? • namespace 就是為了解決這個問題⽽而存在,在定義類 別時,可將類別放在命名空間內 • 在使⽤用 namespace 時,要特別注意⺫⽬目前所在的 namespace 為何? - 可以透過 全名 實體化到該物件 - 可以先⽤用 use 關鍵字宣告
  • 41. 定義 namespace //  23-­‐namespace/app/Helpers/StringHelper.php   <?php   namespace  AppHelpers;   class  StringHelper   {     public  function  sanitize($string)     {       $result  =  trim($string);       $result  =  strip_tags($result);       return  htmlentities($result,  ENT_QUOTES,  'UTF-­‐8');     }   }
  • 42. 使⽤用 namespace 的物件 //  23-­‐namespace/index.php   <?php   require  'app/Helpers/StringHelper.php';   $string  =  '      hello  <h1>world</h1>      ';   $helper  =  new  AppHelpersStringHelper;   echo  $helper-­‐>sanitize($string); //  23-­‐namespace/index.php   <?php   require  'app/Helpers/StringHelper.php';   use  AppHelpersStringHelper;   $string  =  '      hello  <h1>world</h1>      ';   $helper  =  new  StringHelper;   echo  $helper-­‐>sanitize($string);
  • 43. namespace alias • 若覺得 Class 名稱太⻑⾧長、或是遇到兩個⼀一樣名稱的 Class 時,可以使⽤用 alias (別名) 來做區隔 //  23-­‐namespace/index.php   <?php   require  'app/Helpers/StringHelper.php';   use  AppHelpersStringHelper  as  S;   $string  =  '      hello  <h1>world</h1>      ';   $helper  =  new  S;   echo  $helper-­‐>sanitize($string);
  • 44. Trait • Interface 解決了不同類別之間共享能⼒力的問題,但 Interface 無法定義實作內容。若兩個類別的實作內 容相同時,仍有部份的程式碼是重覆的 • Trait 可以把它想像成請 PHP Interpreter 幫我們做程 式碼複製貼上的動作,讓不同類別間的實作內容可 以共⽤用 • 但要特別注意的是,PHP Interpreter 僅幫我們做複 製貼上的動作,並不嚴格的管理 Class 裡的實作是否 符合 Trait 裡假定,若中間有誤是會讓程式出錯的 • 在 Laravel 裡,SoftDelete 就是⽤用 Trait 來實作
  • 45. Trait 範例 //  24-­‐trait/Swimmable.php   trait  Swimmable   {     public  function  swim()     {       echo  'swimming...';     }   }   //  24-­‐trait/Dog.php   class  Dog  extends  Animal   {     use  Swimmable;   }   //  24-­‐trait/index.php   $dog  =  new  Dog;   $dog-­‐>swim();
  • 46. callbacks/callables • 在看 PHP 官⽅方⽂文件時,不知道有沒有注意過有些函 式的參數是 $callback? • 透過 anonymous functions,讓我們可以直接將函式 寫成 callback,不必在另外定義函式 //  25-­‐callback/index.php   //  ⼤大部份的範例   function  cube($n)  {          return  ($n  *  $n  *  $n);   }   $result  =  array_map("cube",  [          1,  2,  3,  4,  5   ]); //  其實可以直接寫成這樣   $r  =  array_map(function($n)  {          return  ($n  *  $n  *  $n);   },  [1,  2,  3,  4,  5]);
  • 47. 傳遞參數⾄至 callback 內 • 使⽤用 anonymous functions 時,函式內部是運作在其 ⾃自⼰己的空間內,換句話說,函式本⾝身無法存取外部 變數的。但可以透過 use 關鍵字將變數傳遞⾄至函式 內部使⽤用 //  25-­‐callback/index.php   $base  =  2;   $result  =  array_map(function($n)  use  ($base)  {          return  $n  *  $base;   },  [1,  2,  3]);   //  $result  =  [2,  4,  6];
  • 48. PSR 規範 • PHP 界充滿了各式各樣的組件與框架。但在早期, 所謂的現代 PHP ⽣生態系還沒⽣生成前,舊版框架在開 發上的作法常常讓開發者無法容易地分享程式碼 • 2009 年在 php | tek 研討會上,數個 PHP 框架的開發 者意識到這樣的問題,因此組成了 PHP-FIG 這樣的 組織,⺫⽬目的在於讓框架之間能夠更有效的溝通與交 流 • PSR 就是 PHP-FIG 提出的建議規範,依照編號⺫⽬目前 有 PSR-1、PSR-2、PSR-3、PSR-4,每⼀一個建議都是 為了解決⼀一些常⾒見的特定問題
  • 49. PSR-4 與 autoload • 以往在使⽤用類別前,都要透過 require、 require_once、include、include_once 等⽅方式 將檔案引⽤用後才可使⽤用,造成檔案的開頭會有⼀一堆引 ⼊入的語法 • 為了解決這個問題,PHP 提供 __autoload() 及 spl_autoload_register() 可以讓開發者⾃自⾏行定義 載⼊入邏輯 • 但若每個開發者的載⼊入邏輯都不同時,對於元件的使 ⽤用者⽽而⾔言也是⼀一樣的困擾。因此 PSR-4 規範裡定義了 ⼀一套 namespace 與資料夾放置的統⼀一作法,只要元件 開發者依循其規範,所有的使⽤用者就可以透過 Composer 處理⾃自動載⼊入的問題
  • 50. 單元總結 • 在這個單元裡我們學到了些什麼? - PHP 基礎觀念 - 物件導向語法 - PHP 5.3+ 新語法及功能