9mza logo

9MZa.net

9mza logo

9MZa.net

มาเริ่มเรียนเขียนโปรแกรมด้วยภาษา PHP กันเถอะ (PHP for Beginners)

Web Development
มาเริ่มเรียนเขียนโปรแกรมด้วยภาษา PHP กันเถอะ (PHP for Beginners)

หากพูดถึงภาษา PHP แล้ว หลายๆ ท่านก็คงจะรู้จักและเคยใช้มาแล้วอย่างแน่นอน (อาจจะเป็นระดับเทพในภาษา PHP แล้วก็ได้ 🤭) เพราะ PHP ถือว่าเป็นภาษา Programming ที่ได้รับความนิยมอย่างมากและพัฒนามาอย่างยาวนาน ถึงแม้ว่าจะมีหลายๆ ความเห็นบอกว่า PHP is dead. แล้วก็เถอะ แต่มันก็ยัง Still Alive in 2022 😅 พร้อมกลับมาอย่างยิ่งใหญ่พร้อม PHP 8 ส่วน PHP 7.4 ก็หมดระยะ Support ไปเป็นที่เรียบร้อยแล้ว (PHP 7.4 หมดระยะซัพพอร์ตแล้ว ตัวสุดท้ายของสาย 7.x) ดังนั้นในบทความนี้เราจะใช้ PHP 8 กัน

ส่วนตัวไม่เคยจับ PHP สักเท่าไหร่ อาจจะไม่เลยด้วยซ้ำ จะมีก็แค่ลง Wordpress แค่นั้น (ก็ไม่ได้เขียน PHP อยู่ดี) เพราะผมเริ่มเขียนโปรแกรมฝั่งเว็บเมื่อไม่นานและผมก็เริ่มต้นกับ JavaScript และพวก Framework ที่เป็นฝั่ง Frontend ซะมากกว่า

ในบทความนี้อาจจะไม่ค่อยลงลึกเรื่องทฤษฎีมาก เพราะเป็นการเรียนรู้และจดบันทึกให้กับตัวผมเอง ผมจึงได้นำมาเรียบเรียงเนื้อหาเป็นบทความ เผื่อใครที่อยากเริ่มต้นเขียน PHP ก็จะได้เริ่มต้นได้ง่ายขึ้น

Prerequisite

Server

ในบทความนี้ผมจะใช้งาน PHP ผ่าน Docker ซึ่งผมมัดรวม Apache PHP ไว้ ด้วยความที่เป็นวิธีที่ผมรู้สึกชอบ และกำลังศึกษา ก็เลยถือโอกาสเอามาลองเขียน PHP มันซะเลย ใครที่อยากลองใช้งานผ่าน Docker สามารถดูวิธีการได้ตามนี้เลย การติดตั้งและใช้งาน PHP Apache และ MySQL ด้วย Docker Compose

แต่ถ้าใครไม่อยากใช้ Docker ก็มีอีกวิธี

  • Linux: สามารถติดตั้งผ่าน Package Manager ได้เลย เช่น ตระกูล Debian apt install php หรือ yum install php ตระกูล RedHat
  • macOS: สามารถติดตั้งผ่าน Homebrew ได้เลย brew install php
  • Windows: สามารถติดตั้งผ่าน Chocolatey choco install php หรือ winget winget install php

หรือถ้าวิธีการข้างบนยังรู้สึกว่ายาก อาจจะลองพวกเครื่องมือที่มัดรวม PHP ไว้ให้แล้ว ก็ได้นะครับ เช่น

  • Laragon 🐘 สำหรับ Windows ผมแนะนำอันนี้ เป็นพิเศษ
  • MAMP
  • XAMPP
  • WAMP

Tools

เมื่อได้ Server แล้ว ก็ต้องมี Tools ในการเขียนโปรแกรมด้วย PHP ด้วย ซึ่งก็มีมากมายหลายตัวทั้งแบบฟรี และแบบเสียเงิน ซึ่งในบทความนี้ผมจะใช้ Visual Studio Code และ PHP Intelephense ซึ่งเป็น Extension ของ Visual Studio Code ที่ช่วยให้เขียนโปรแกรมด้วย PHP ได้ง่ายขึ้น

สำหรับอีกตัวที่ใช้ในบทความนี้คือ Terminal เพราะต้องจัดการกับ Docker ซึ่งก็สามารถใช้ Terminal ที่ติดมากับเครื่องของแต่ละ OS ได้เลย

มารู้จัก PHP Tag กันก่อน

ในการเขียนโปรแกรมด้วยภาษา PHP เราจะเปิดด้วย <?php เพื่อเริ่มต้นคำสั่ง และปิด ?> เมื่อสิ้นสุดคำสั่ง

มาลองเขียนกัน โดยการสร้างไฟล์ index.php แล้วเขียน code HTML และ PHP ดังนี้

HTML Logo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <h1></h1> </body> </html>

จากนั้นลองแทรก code PHP เข้าไปใน tag h1 โดยใช้คำสั่งง่ายๆ อย่าง echo

PHP Logo
<h1><?php echo 'Hello PHP 🐘' ?></h1>

เปิด Browser แล้วเข้าไปที่ http://localhost:8000 เพื่อดูผลลัพธ์สักหน่อย

Variable

ในการสร้างตัวแปรใน PHP จะใช้เครื่องหมาย $ ขึ้นต้นแล้วตามด้วยชื่อตัวแปรที่เราต้องการที่จะตั้ง

PHP Logo
<?php $name = 'John'; ?>

Concatenate

Concatenate คือ การเอาค่าของตัวแปรมาต่อกัน ใน PHP โดยจะใช้ . ในการต่อค่าของตัวแปร

PHP Logo
<?php $firstName = 'John'; $lastName = 'Doe'; echo $firstName . ' ' . $lastName; // Output: John Doe

String Interpolation

เราสามารถใช้ String Interpolation เข้ามาช่วยในการต่อค่าของตัวแปรได้ โดยใช้เครื่องหมาย " แทนการใช้เครื่องหมาย ' ในการประกาศตัวแปร

PHP Logo
<?php $firstName = 'John'; $lastName = 'Doe'; echo "$firstName $lastName"; // Output: John Doe

จะเห็นว่าเราไม่ต้องใช้เครื่องหมาย . ในการต่อค่าของตัวแปรแล้ว

Conditionals and Booleans

Condition หรือ เงื่อนไข คือ สิ่งที่กำหนดเงื่อนไขการทำงานของโปรแกรมของเรา เช่น ถ้าเงื่อนไขนี้เป็นจริง จะให้โปรแกรมทำอะไร แล้วถ้าเงื่อนไขนี้เป็นเท็จ จะให้ทำอะไร

ซึ่ง Condition ก็จะมาคู่กันกับ Boolean ซึ่งก็คือ True, False หรือก็คือ จริง หรือ เท็จ นั่นเอง

ซึ่งใน PHP จะเขียน Condition ดังนี้

โดยเงื่อนไขแรกคือ if เป็นเงื่อนไขที่เราต้องการให้โปรแกรมทำงานเมื่อเงื่อนไขนั้นเป็นจริง และ else เป็นเงื่อนไขที่เราต้องการให้โปรแกรมทำงานเมื่อเงื่อนไขนั้นเป็นเท็จ

มาลองเขียนกันดูหน่อย เปิดไฟล์ index.php แล้วเขียน if else ง่ายๆ ดังนี้

PHP Logo
$love_php = true; if ($love_php) { echo 'I love PHP 😍'; } else { echo 'I don\'t love PHP 🤬'; }

ในไฟล์ index.php จะได้หน้าตาประมาณนี้

ลองมาดูผลลัพธ์ที่ Browser กัน

จะเห็นว่าข้อความ I love PHP 😍 ถูกแสดงออกมา เพราะเงื่อนไขเป็นจริง และถ้าเราลองเปลี่ยนค่า $love_php = false; ดูบ้าง refresh หน้าเว็บ แล้วมาดูผลลัพธ์กัน

Arrays

Array คือ การเก็บข้อมูลหลายๆ ค่าไว้ในตัวแปรเดียวกัน หรือจะเรียกว่าเก็บข้อมูลเป็น Collection ก็ได้ ซึ่งใน PHP จะเขียน Array ดังนี้

PHP Logo
$top_five_movies = [ 'The Shawshank Redemption', 'The Godfather', 'The Godfather: Part II', 'The Dark Knight', '12 Angry', ];

จากนั้นจะทำการ Loop ข้อมูลใน Array ออกมา โดยใช้ foreach

สำหรับการใช้ foreach เราจะ pass ตัวแปรที่เก็บข้อมูลเป็น array เข้าไปใน foreach แล้วใช้ as เพื่อกำหนดตัวแปรเพื่อมาเก็บค่าของแต่ละรอบ โดยเราจะตั้งชื่อว่าอะไรก็ได้ แต่เพื่อความให้สอดคล้องกับข้อมูลผมจะตั้งชื่อว่า $movie

PHP Logo
<ul> foreach ($top_five_movies as $movie) { echo "<li>$movie</li>" } </ul>

เราสามารถเขียน foreach แบบ shorthand ได้ดังนี้

PHP Logo
<ul> <?php foreach ($top_five_movies as $movie): ?> <li><?= $movie ?></li> <?php endforeach; ?> </ul>

กลับมาที่ไฟล์ index.php แล้วมาลองเขียนโค้ดกัน โดยนำมาแทรกใน tag HTML ตามนี้

เสร็จแล้วก็ refresh หน้าเว็บ แล้วมาดูผลลัพธ์กัน

Associative Arrays

Associative Arrays คือ Array ที่มี Key และ Value โดยเราจะสร้างตัวแปรที่เป็น Array จากนั้นเราจะกำหนดชื่อ Key และใช้ เครื่องหมาย => ในการกำหนด Value ของ Key นั้นๆ

PHP Logo
$top_five_movies = [ [ 'title' => 'The Shawshank Redemption', 'year' => 1994, 'rating' => 9.2 ], [ 'title' => 'The Godfather', 'year' => 1972, 'rating' => 9.1 ], [ 'title' => 'The Godfather: Part II', 'year' => 1974, 'rating' => 9.0 ], [ 'title' => 'The Dark Knight', 'year' => 2008, 'rating' => 9.0 ], [ 'title' => '12 Angry', 'year' => 1957, 'rating' => 8.9, ], ];

จากนั้นเราจะทำการ Loop ข้อมูลออกมา โดยใช้ foreach โดยการเข้าถึงข้อมูล เราจะเรียกผ่าน key วิธีการก็คืออย่างเช่น อยากเข้าถึง key title ในตัวแปร $top_five_movies ก็จะเป็น $movie['title']

เปิดไฟล์ index.php แล้วลองเขียนโค้ดตามด้านล่างนี้

PHP Logo
<?php foreach ($top_five_movies as $movie) : ?> <li><?= $movie['title'] . ' ' . $movie['year'] . ' rating ' . $movie['rating'] ?></li> <?php endforeach; ?>

เมื่อเราเขียนโค้ดเสร็จแล้ว ก็ refresh หน้าเว็บ แล้วมาดูผลลัพธ์กัน

Functions

Functions (ฟังก์ชัน) คือ ชุดโค๊ดที่เราสามารถเรียกใช้งานได้ซ้ำๆ ลองนึกภาพดูว่า ถ้าเราต้องให้โปรแกรมทำงานแบบเดิมสัก 10 รอบ เราคงไม่มานั่งเขียนโค้ดเดิมซ้ำไปซ้ำมา 10 รอบหรอก จริงไหมครับ ดังนั้นเราจึงสร้าง Function ขึ้นมาเพื่อใช้งานซ้ำๆ ได้

โดยในบทความนี้เราจะมาเขียน function สำหรับ filters หรือกรองข้อมูลในตัวแปร $top_five_movies กัน

PHP Logo
function filterByYear($movies, $year) { $filtered = []; foreach ($movies as $item ){ if ($item['year']=== $year) { $filtered[] = $item; } } return $filtered; };

อธิบายโค้ดกันสักนิด ผมได้สร้าง function ชื่อว่า filterByYear โดยมี parameter 2 ตัวคือ $movies และ $year โดย $movies ใช้รับค่า array ของ movies และ $year ใช้รับค่าปีที่เราต้องการ filter ออกมา

จากนั้นทำการ Loop ข้อมูลที่ได้จาก function filterByYear โดยใช้ foreach ตามโค้ดข้างล่างนี้เลย

PHP Logo
<?php foreach (filterByYear($top_five_movies, 2008) as $movie) : ?> <li><?= $movie['title'] . ' ' . $movie['year'] . ' rating ' . $movie['rating'] ?></li> <?php endforeach; ?>

เนื่องจาก function ต้องการ parameter 2 ตัว โดย parameter แรกผมส่งค่า $top_five_movies ที่เป็น array และ parameter ที่สองผมส่ง 2008 ที่เป็น integer ไปให้ function ทำงาน

เพื่อความชัวร์เรามาดูโค้ดอีกรอบ จะได้หน้าตาออกมาประมาณนี้

เสร็จแล้วมาดูที่หน้าเว็บเรา จะเห็นว่าเราได้ filter ข้อมูลออกมาเรียบร้อยแล้ว

ลองเปลี่ยนปีให้เป็น 1974 ดูหน่อย

Lambda Function

ในภาษา PHP และภาษาอื่นๆ ที่เป็น Functional Programming จะมีการใช้งาน Lambda Function หรือ Anonymous Function ซึ่งเป็นการสร้าง function โดยไม่ต้องมีชื่อ ซึ่งสามารถนำไปใช้งานได้หลายอย่าง เช่น สามารถเก็บไว้ในตัวแปรได้ สามารถส่งเป็น parameter ไปให้ function อื่นๆ ได้ หรือสามารถ return ค่ากลับมาได้

ตัวอย่าง

  • Lambda Function โดยรับ parameter 2 ตัว และ return ค่ากลับมา
PHP Logo
$add = function($x, $y) { return $x + $y; }; echo $add(1, 2); // 3

โดยเป็นผลบวกของ parameter ทั้ง 2 ตัว

ทีนี้เราจะนำเอา Lambda Function มาใช้กับการ filter ข้อมูลใน $top_five_movies ดูบ้าง

PHP Logo
function filter($items, $key, $value) { $filteredItems = []; foreach ($items as $item) { if ($item[$key] === $value) { $filteredItems[] = $item; } } return $filteredItems; }

ต่อมาเราจะสร้าง Lambda Function เพื่อเก็บค่า filter แต่ละแบบ โดยผมจะสร้าง 2 แบบ คือ

  • $filterByYear สำหรับ filter ด้วยปี
  • $filterByRating สำหรับ filter ด้วย rating

มาลองเขียน function filterByYear กันก่อน โดยข้อมูลที่นำมา filter จะเป็นข้อมูลจากตัวแปร $top_five_movies

PHP Logo
$filterByYear = filter($top_five_movies, 'year', 1974);

เปลี่ยนตัวแปรใน foreach ให้เป็น $filterByYear แทน

PHP Logo
<?php foreach ($filterByYear as $movie) : ?> <li><?= $movie['title'] . ' ' . $movie['year'] . ' rating ' . $movie['rating'] ?></li> <?php endforeach; ?>

จะได้โค้ดออกมาหน้าตาประมาณนี้

ผลลัพธ์ใน Browser จะเห็นว่ามีการ filter ข้อมูลด้วยปี 1974 ออกมาเท่านั้น

มาลองใช้ filterByRating กันบ้าง

PHP Logo
$filterByRating = filter($top_five_movies, 'rating', 9.0);

เปลี่ยนตัวแปรใน foreach ให้เป็น $filterByRating แทน

PHP Logo
<?php foreach ($filterByRating as $movie) : ?> <li><?= $movie['title'] . ' ' . $movie['year'] . ' rating ' . $movie['rating'] ?></li> <?php endforeach; ?>

จะได้โค้ดออกมาหน้าตาประมาณนี้

ผลลัพธ์ใน Browser จะเห็นว่ามีการ filter ข้อมูลด้วย rating 9.0 ออกมาเท่านั้น

นอกจากนี้เรายังสามารถส่ง function เข้าไปทำงานได้ ทำให้เพิ่มความยืดหยุ่นเข้าไปอีก

PHP Logo
function filter($items, $fn) { $filteredItems = []; foreach ($items as $item) { if ($fn($item)) { $filteredItems[] = $item; } } return $filteredItems; } $filterMovies = filter($top_five_movies, function ($movie){ return $movie['rating'] > 9.0; }); ?>

เปลี่ยนตัวแปรใน foreach ให้เป็น $filterMovies แทน

PHP Logo
<?php foreach ($filterMovies as $movie) : ?> <li><?= $movie['title'] . ' ' . $movie['year'] . ' rating ' . $movie['rating'] ?></li> <?php endforeach; ?>

หน้าตาโค้ดจะเป็นประมาณนี้

ลองมาดูผลลัพธ์ใน Browser กันหน่อย

นอกจากเราจะเขียน function ไว้ใช้งานเองได้แล้ว ใน PHP ยังมี Built-in function ไว้ให้เราได้ใช้งานกันแบบง่ายๆ ที่แทบจะไม่ต้องเขียน function เองตามที่เราได้เขียนไปในตอนต้นเลย 🤭

เช่น ถ้าหากเราต้องการที่จะ filter ข้อมูลใน array เหมือนที่เราทำกันมาในตัวอย่างข้างต้น เราสามารถใช้ array_filter ได้เลย ตามโค้ดด้านล่าง

PHP Logo
$filterMovies = array_filter($top_five_movies, function ($movie) { return $movie['year'] > 1973; });

Separate Logic From the Template

ในชีวิตจริง เราคงไม่เขียน HTML กับ PHP ในไฟล์เดียวกันหรอก จริงไหมครับ เพราะฉะนั้นเราจะแยก HTML กับ PHP ออกจากกัน พูดง่ายๆ ก็คือแยกส่วน Logic กับส่วน Template หรือส่วน View ออกจากกัน โดยจะแยกไฟล์ตามนี้

  • index.php สำหรับส่วนของ Logic
PHP Logo
<?php $top_five_movies = [ [ 'title' => 'The Shawshank Redemption', 'year' => 1994, 'rating' => 9.2 ], [ 'title' => 'The Godfather', 'year' => 1972, 'rating' => 9.1 ], [ 'title' => 'The Godfather: Part II', 'year' => 1974, 'rating' => 9.0 ], [ 'title' => 'The Dark Knight', 'year' => 2008, 'rating' => 9.0 ], [ 'title' => '12 Angry', 'year' => 1957, 'rating' => 8.9, ], ]; function filter($items, $fn) { $filteredItems = []; foreach ($items as $item) { if ($fn($item)) { $filteredItems[] = $item; } } return $filteredItems; } $filterMovies = array_filter($top_five_movies, function ($movie) { return $movie['year'] > 1973; }); require 'index.view.php';
  • index.view.php สำหรับส่วนของ View หรือ Template
PHP Logo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1>IMDb Top 5 Movies</h1> <ul> <?php foreach ($filterMovies as $movie) : ?> <li><?= $movie['title'] . ' ' . $movie['year'] . ' rating ' . $movie['rating'] ?></li> <?php endforeach; ?> </ul> </body> </html>

หลังจากจัดการแยก Logic กับ View แล้วจะได้หน้าตาดังนี้