前言

客製化 wp 主題時,一定會需要透過 php 去與 wp 進行互動。而 php (Hypertext Preprocessor) 作為一Server site 的 後端 Script 語言,主要用途是在於處理 動態網頁,同時結合了 HTML 與 JS 去進行網頁前端的渲染、後端的控制,一方面是令人感到驚嘆 (實在是太方便),一方面卻也讓整個程式碼內部顯得有些混亂 (同時有HTML、JS、CSS、php),也讓筆者覺得維護上或是進行註解時都有些不容易,然而大部分的 wp 要客製化絕對都無法避免寫到 php ,但是也別擔心,對於開發 wp 主題自製化來說,並不會用到太深入的 php 概念或語法,那麼就讓我們開始吧。

大綱

  • php 基本
  • debug 除錯常見語法
  • php 稀奇古怪部分
  • 常見 wp php 語法

php 基本

起手式要記住一個非常古怪又不便的符號,php 定義了此 tag 後,在裡面才能撰寫其內的 code,由於要與 HTML Tag 混用,要相當注意這些 tag 擺放位置等等,否則常常會出現無法找到問題點的狀況。

<?php
    // your code
?>

包含8種基本資料型別、型別可簡單分三大類型: 4種數值(scalar)的型別:

  • 布林值(boolean),只有1或0,表示TRUE或FALSE
  • 整數(interger),PHP的整數範圍為-2147483648 ~ 2147483647
  • 浮點數 (float),例如 $flaot = 1.23
  • 字串 (string),例如 "hello world"

2種複合(compound)的型別:

  • 陣列 (array)
  • 物件 (object) -> wp 中鮮少用到
// 陣列兩種方式
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// as of PHP 5.4
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

2種特殊型別:

  • 資源 (resource) -> wp 基本遇不到,這邊不會特別提到
  • 空值 (NULL)

而在 php 中也有常數的定義,通常是用 define 進行定義,也是 wp 中很常見到的語法

<?php
    define("SAYHI", "Hi, I’m Alex");
    echo SAYHI;
?>

debug 除錯常見語法

<?php
$var = 123;
// 常見印出來檢查方式
echo $var; //123
print_r($var); //123
var_dump($var); //int(123)

//型別判斷
* echo gettype($var) //integer
?>

另外也能在終端機輸入 $php -a,透過 php Interactive shell 進行檢驗

php 稀奇古怪部分

跟大家聊聊 php 特別之處。php 有一些相異於大部分程式語言的寫法,讓筆者覺得非常有意思,這邊也與大家進行些分享。

string

  • php 字串串接用 . 作為連接,其他語言大部分是以 +

    <?php
    $a = 'hello';
    $b = ' world';
    $res = $a . $b;
    var_dump($res); // string(11) "hello world"
    ?>

    boolean

  • true 和 false 大小寫沒差,可寫成 trUe

  • php 如果是 true 則回傳 1 反之為 空值

    • 這一點在剛開始寫 php 時常常莫名採坑
  • 兩個等號只會比對值、三個等號比對資料類別

  • 兩個同內容物陣列比對,結果也是 true

<?php
$flag = FaLsE;
var_dump($flag == fAlSe); // bool(true)

$a = true; $b = true; $c = false;
echo $a===$b; // 1 
echo $a===$c; // 空值

$d = 1;
echo $a==$d; // 1 
echo $a===$d; // 空值

$ary1 = array(1,2,3); 
$ary2 = array(1,2,3); 
var_dump($ary1===$ary2); //bool(true)
?>

以下情況轉型為布林時,結果為FALSE:

  • boolean型別值為FALSE之變數
  • integer型別值為0之變數
  • float型別值為0.0之變數
  • string為空字串或值為”0”之變數
  • 空陣列array之變數
  • NULL
  • 無成員之object型別之變數(PHP 4之前,PHP4之後object轉型永遠為TRUE)
<?php
var_dump((bool) 0);             // bool(false)
var_dump((bool) -1);            // bool(true)
var_dump((bool) 0.0);           // bool(false)
var_dump((bool) 123.99);        // bool(true)
var_dump((bool) "");            // bool(false)
var_dump((bool) "0");           // bool(false)
var_dump((bool) "false");       // bool(true)
var_dump((bool) array());       // bool(false)
var_dump((bool) array(false));  // bool(true)
var_dump((bool) new stdClass);  // bool(true), PHP 4之前: bool(false)
?>

Associated Array

  • 語法為 :
<?php
$myArray = array($mykey=>'hi I am Value');
?>
  • 很像大部分語言的 JSON 陣列
<?php
var myArray = {
    "mykey": 'hi I am Value';
}
?>

常見 wp php 語法

  • If Else Statement
  • Logitcal Operator
  • Array
  • 關聯陣列 Associated Array
  • While Loop 與 forLoop
<?php
// If Else Statement
$a = true; #b = false;
if($a===$b){echo 'yes';} else {echo 'no'}

// Logitcal Operator  
$a = (1>2 or 3<4);  //or兩端只要其中一個條件成立就會返回true。反之,返回false。
var_dump($a);  //輸出變數$a的資料型態與內容
echo '<br>';
$b = (1>2 and 3<4);  //and兩端條件皆成立才會返回true。反之,返回false。
var_dump($b);  //輸出變數$b的資料型態與內容
echo '<br>';
$c = !(1>2);  //!表示「不是」,1>2不成立會返回false,負負得正的結果,變成true。
var_dump($c);  //輸出變數$c的資料型態與內容

// Array
$ary = array(1,2,"3"); 
var_dump($ary); //array(3) {[0]=>int(1) [1]=>int(2)[2]=>string(1) "3"}
$ary2 = [1,2,"3"]; 
var_dump($ary); //array(3) {[0]=>int(1) [1]=>int(2)[2]=>string(1) "3"}
?>

此外,讓我們聊聊 關聯陣列 (Associated Array) ,WP也很常見到它,概念很簡單,是讓我們指定陣列關鍵字當作索引,範例如下:

<?php
$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");
//or
$age['Peter'] = "35";
$age['Ben'] = "37";
$age['Joe'] = "43";
// 想要取得 key
print_r(array_keys($age));
/*
Array
(
    [0] => Peter
    [1] => Ben
    [2] => Joe
)
*/
?>

先來簡單說 forLoop ,在 php 世界中,Loop 相對其他語言沒有太大差別

<?php
/* example 1 */
for ($i = 1; $i <= 10; $i++) {
    echo $i;
}
?>

While Loop 是在 wp 上會常用的迴圈方式,後面會提到的 strand loopcustom loop,都常常與其搭配

<?php
/* 寫法 1 */
$i = 1;
while ($i <= 10) {
    echo $i++;  /* the printed value would be
                   $i before the increment
                   (post-increment) */
}

/* 寫法 2 */
// 也是 wp 中比較常見的寫法
$i = 1;
while ($i <= 10):
    echo $i;
    $i++;
endwhile;
?>

也有 foreach 寫法,經常與 array 搭配使用

// 搭配 array 進行使用
<?php
$scores['John'] = 77;
$scores['Christine'] = 93;
$scores['Teddy'] = 82;
$scores['Grace'] = 56;
foreach ($scores as $name => $score) {
    echo "$name's score is $score\n";
} 

/* 
Output:
John's score is 77
Christine's score is 93
Teddy's score is 82
Grace's score is 56
*/

以上大概是 WP 中常見的 php 觀念,這邊我們就點到為止,後續我們來聊聊 WordPress 中檔案結構的階層概念,下次見囉~

參考資料

PHP: Hypertext Preprocessor