PHP basics

PHP basics

2019/10/12 (更新內容)
2023/10/07 (補充內容)
2023/10/26 (補充內容)

開發環境

利用PHP開發web應用,需要Apache Web Server、資料庫(MySQL/MariaDB)、PHP,也有一些安裝包(如:AppServ、MAMP、XAMPP)將這些軟體包裝好,可以一次安裝好,不必一個一個的安裝。使用安裝包的時候要注意,每個安裝包所內含的軟體是不太一樣的,目前最大的差異在於使用MySQL或MariaDB,例如,XAMPP內含MariaDB,AppServ內含MySQL,WampServer則是MySQL及MariaDB,另外,還要注意的是支援的作業系統,AppServ及WampServer支援windows,XAMPP號稱跨平台,所以,支援Windows、Mac、Linux版本。不過,因為XAMPP後來支援MariaDB,很多的設定都跟MySQL不一樣,會有一些困擾。

在家使用Windows的同學,可以採用AppServ或XAMPP,目前資訊中心安裝的版本有AppServXAMPP。使用Mac的同學採用MAMP或XAMPP。

上資料庫課程時,老師會要求助教告訴大家直接安裝mysql,原因是要讓大家知道,如果不用AppServ或XAMPP,也可以使用mysql。我們可以下載免費的community server,目前最新版本是8.2.0。因為跟App Serv及XAMPP上的資料庫版本不一樣,使用時請注意。另外,可下載MySQL Workbench,目前最新版本是: 8.0.34。

安裝步驟請詳參:

appserv.pptx

第一個PHP程式

** 有些appserv版本預設不顯示錯誤,所以,要編輯php.ini,將

display_errors = Off

改為

display_errors = On

<?php

echo "Hello";

?>

啟動Apache後,在瀏覽器上輸入:

http://localhost/web

Apache就會執行web資料夾下的index.php,所以,就可以看到

Hello

也可以找出電腦的ip,試著從另一台電腦(或手機)連上剛剛寫的網頁

** 如果看到「 localhost 拒絕連線」,通常是我們還沒啟動Apache。如果看到「 Error 404」,通常是檔案名稱錯誤或資料夾名稱錯誤。

基本語法與輸出

<?php   ?>中間就是php的程式碼,echo 或 print就是印出內容的意思,所以,這程式會印出「My first PHP script!」(詳參: PHP 7 echo and print Statements)

<?php

echo "My first PHP script!";

?>

如果內容包含HTML,那就成了網頁了。php是以「.」來連接兩個字串,另外,php有一些內建的函數,如date。(詳參: PHP 7 Date and Time  & PHP 7 Date/Time Functions & PHP 7 Calendar Functions)

<?php

echo "My first PHP script!";


echo "<p>";

echo "Today is " . date("Y/m/d") . "<br>";

echo "Today is " . date("Y.m.d") . "<br>";

echo "Today is " . date("Y-m-d") . "<br>";

echo "Today is " . date("l") . "<br>";

echo "The time is " . date("h:i:sa"). "<br>";

?>

也可以寫成:

My first PHP script!<p>

Today is <?php echo date("Y/m/d") ?><br>

Today is <?php echo date("Y.m.d") ?><br>

Today is <?php echo date("Y-m-d") ?><br>

Today is <?php echo date("l") ?><br>

Today is <?php echo date("h:i:sa") ?><br>

php 5以後,可以利用<?= ?>,簡化<? php echo ?> (詳參:  [鐵人賽Day12]PHP的簡寫標籤與使用方式 )。

My first PHP script!<p>

Today is <?= date("Y/m/d") ?><br>

Today is <?= date("Y.m.d") ?><br>

Today is <?= date("Y-m-d") ?><br>

Today is <?= date("l") ?><br>

Today is <?= date("h:i:sa") ?><br>

變數

PHP的變數使用方式跟python比較像,不需要設定變數的資料型態。跟python不同的是,PHP的變數名稱前要加上"$" (詳參: PHP 7 Variables & PHP 四種變數範圍比較:區域、全域、靜態、參數)。

<?php

$x = 2;

$y = 3;

echo $x + $y;

?>

跟python很像,同一個變數,在不同的時間可以儲存不同資料型態的內容。

<?php

$x = 'hello world';

echo $x;

$x = 1;

echo $x;

?>

這時候,數字相加跟字串相加的效果就不一樣了,而PHP會自動的轉換對應的資料型態,試試看以下的程式:

<?php

$x = 2;

$y = 3;

echo $x + $y;

echo "<br>";

echo $x . $y;

echo "<br>";

$x = "20";

$y = "30";

echo $x + $y;

echo "<br>";

echo $x . $y;

echo "<br>";

?>

也可以在字串裡直接放變數,可以省掉字串相加的麻煩,這也是PHP變數要加「$」的原因。

$txt = "PHP";

echo "I love ".$txt."!";

echo "I love $txt!";

php變數名稱的規則:

判斷式

PHP的判斷式跟java比較像 (詳參: PHP Operators),不過,源頭應該不是java,而是c語言,因為java與PHP的公開使用都是在1995年左右。

$x = 100;  

$y = "100";


var_dump($x == $y); // 顯示bool(true)因為會忽略變數類型

$x = 100;  

$y = "100";


var_dump($x === $y); // 顯示bool(false)因為變數類型不同

if

php的if跟java的表示方法一樣。

<?php

$r = rand(1,30);


if ($r < 20) {

    echo "小於20";

}

else {

    echo "大於20";

}

?>

switch

php的if跟java的表示方法一樣。

<?php

$r = rand(1,6);


switch ($r) {

    case 1:

        echo "扣五分";

        break;

    case 2:

        echo "扣三分";

        break;

    case 3:

        echo "扣一分";

        break;

    default:

        echo "得三分";

}

?>

Ternary (? :)

這個語法在java及python也都有,如果問號前的條件為真,回傳冒號前的內容,否則,回傳冒號後的內容。

$statuslist = isset($_POST["status"])? $_POST["status"] : ["N/A"];

Null coalescing (??) (php 7的語法)

如果??前的內容存在且不是空值,則傳回??前的值,否則,傳回??後的值。(詳參: Null coalescing operator)

//new syntax in php 7

$statuslist = $_POST["status"]?? ["N/A"];

相當於

$statuslist = isset($_POST["status"])||!is_null($_POST["status"])? $_POST["status"]:["N/A"];

迴圈

PHP的迴圈跟java比較像。

while

<?php 

$x = 1; 


while($x <= 5) {

    echo "The number is: $x <br>";

    $x++;

?>

for

<?php 

for ($x = 0; $x <= 10; $x++) {

    echo "The number is: $x <br>";

?>

迴圈結合table

<?php

echo "<table border='1'>";

for ($col = 0; $col < 10; $col++) {

echo "<tr>";

    for ($row = 0; $row <10; $row ++){

        echo "<td>".$row."</td>";

    }

echo "</tr>";

echo "</table>";

?>

也可以寫成,這種寫法對開發者來講很難看的懂,但是一般的語法檢查器(linter)比較能幫我們檢查語法:

<table border='1'>

<?php

for ($col = 0; $col < 10; $col++) {?>

<tr>

<?php

    for ($row = 0; $row <10; $row ++){ ?>

        <td><?=$row?></td>

<?php    }?>

</tr>

<?php}?> 

</table>

兩種寫法都是把HTML跟PHP混雜在一起,其實很容易眼花撩亂。尤其是寫好HTML之後,要把PHP的邏輯放進去之後,很容易就會跑版。或者是寫好PHP之後再去改HTML,就會讓PHP出現語法錯誤。

陣列

php的陣列表示方法跟java或python不太一樣,不過原理滿相似的。就跟python一樣,陣列裡的資料型態可以不同。PHP還有一種比較特別的陣列Associative Arrays(詳參:PHP 7 ArraysPHP 7 Multidimensional Arrays)。

陣列也可以使用foreach,php的foreach其實在java與python都有類似的語法。

print_r()  (也可以用var_dump()) 可以印出陣列的內容。

<?php

$customers = array( "Ben", "Mary", "Tom", "Nancy", "Peter");

         

foreach( $customers as $customer ) {

   echo "Value is $customer <br />";

}


$customers[2] = "Sam";

$customers[9] = "Steven";

print_r ($customers);

echo "</br>";


foreach( $customers as $cus ) {

   echo "Value is $cus <br />";

}


?>

陣列的寫法也可以寫成:

<?php

$customers = ["Ben", "Mary", "Tom", "Nancy", "Peter"];

         

foreach( $customers as $customer ) {

   echo "Value is $customer <br />";

}


$customers[2] = "Sam";

$customers[9] = "Steven";

print_r ($customers);

echo "</br>";


foreach( $customers as $cus ) {

   echo "Value is $cus <br />";

}


?>

結果會是:

Value is Ben 

Value is Mary 

Value is Tom 

Value is Nancy 

Value is Peter 

Array ( [0] => Ben [1] => Mary [2] => Sam [3] => Nancy [4] => Peter [9] => Steven ) 

Value is Ben 

Value is Mary 

Value is Sam 

Value is Nancy 

Value is Peter 

Value is Steven 

Associative Arrays

<?php

$customers = array( "Ben"=>20, "Mary"=>30, "Tom"=>40, "Nancy"=>60, "Peter"=>50);

         

foreach( $customers as $customer ) {

   echo "Value is $customer <br />";

}


$customers["Mary"] = 35;

$customers["Steven"] = 30;

print_r ($customers);

echo "</br>";


foreach( $customers as $cus ) {

   echo "Value is $cus <br />";

}


?>

陣列的寫法也可以寫成:

<?php

$customers = ["Ben"=>20, "Mary"=>30, "Tom"=>40, "Nancy"=>60, "Peter"=>50];

         

foreach( $customers as $customer ) {

   echo "Value is $customer <br />";

}


$customers["Mary"] = 35;

$customers["Steven"] = 30;

print_r ($customers);

echo "</br>";


foreach( $customers as $cus ) {

   echo "Value is $cus <br />";

}


?>

結果會是:

Value is 20 

Value is 30 

Value is 40 

Value is 60 

Value is 50 

Array ( [Ben] => 20 [Mary] => 35 [Tom] => 40 [Nancy] => 60 [Peter] => 50 [Steven] => 30 ) 

Value is 20 

Value is 35 

Value is 40 

Value is 60 

Value is 50 

Value is 30 

如果要同時列出key及value: (詳參: foreach)

<?php

$customers = array( "Ben"=>20, "Mary"=>30, "Tom"=>40, "Nancy"=>60, "Peter"=>50);

         

foreach( $customers as $name => $age ) {

   echo "Name is $name and age is $age <br />";

}


?>

函數

php的函數語法混合了java及python的語法 (詳參: PHP 7 Functions),引數(argument)可以有預設值,在php7之後,引數可以設資料型態,並利用return回傳值。

<?php

function println($p="-----") {

    echo $p."<br>";

}


println("hello"); // call the function

println("my name");

println();

println("is ben");

?>

參考資料

PHP 7

開發環境

** 注意 **  在學校使用時,會有無法取得php的問題,所以,沒辦法幫忙檢查php語法。要修改設定檔。利用Debug->Open Preferences File,會打開兩個檔案:defaultPreferences.json及brackets.json,defaultPreferences.json是供參考,不能修改的,要修改brackets.json

brackets.json:

{

    "brackets-eslint.gutterMarks": true,

    "brackets-eslint.useLocalESLint": false,

    "fonts.fontSize": "12px",

    "fonts.fontFamily": "'SourceCodePro-Medium', MS ゴシック, 'MS Gothic', monospace",

    "useTabChar": true,

    "tabSize": 2,

    "brackets-minifier.on-save": false,

    "hirse.outline.enabled": true,

    "linting.enabled": true,

    "brackets-minimap.whatsnew": "3.2.6",


    "php": {

        "enablePhpTooling": true,

        "executablePath": "C:\\AppServ\\php7\\php.exe",

        "memoryLimit": "4095M",

        "validateOnType": "false"

        }

}

也可以在專案目錄下建立.brackets.json,這些設定就只適用在這個專案。(詳參: Preferences)