วันอังคารที่ 16 ธันวาคม พ.ศ. 2557

คำสั่ง SQL

1. SELECT Statement

ไวยากรณ์

ประโยคคำสั่ง SELECT
SELECT [ALL | DISTINCT] column1[,column2]
FROM table1[,table2]
[WHERE conditions ]
[GROUP BY column-list ]
[HAVING conditions ]
[ORDER BY column-list   [ASC | DESC] ];
[ ] ตัวเลือก

ตัวอย่าง

SELECT name, title, dept
FROM employee
WHERE title LIKE 'Pro%';
ประโยคคำสั่งข้างบนจะเลือก แถว/ค่า ในคอลัมน์ name, title และ dept จาก table “employee” ที่มี title เริ่มต้นด้วย ‘Pro’ ซึ่งจะส่งตำแหน่งงานของ Programmer หรือตำแหน่งอื่นที่ขึ้นต้นด้วย Pro ออกมา

2. GROUP BY

ไวยากรณ์

GROUP BY clause
SELECT column1, SUM(column2 )
FROM list-of-tables
GROUP BY column-list ;
GROUP BY clause ใช้หาผลรวมของคอลัมน์จากแถวในคอลัมน์ที่ระบุ และทำงานร่วมกับ aggregate function ที่ทำงานกับคอลัมน์ 1 คอลัมน์หรือมากกว่า เพื่อหาผลรวมของกลุ่มของแถวข้อมูล
SELECT max(salary), dept
FROM employee
GROUP BY dept;
ประโยคคำสั่งนี้จะเลือกค่า salary มากที่สุด ในแต่ละฝ่าย

ตัวอย่าง

การจัดกลุ่มภายในคอลัมน์ เช่น table ‘item_order’ มีคอลัมน์ quantity ที่เก็บค่า 1, 2, 3 และอื่นๆ โดยต้องการหาค่าราคาสูงสุดของละค่าใน quantity สามารถเขียนคำสั่งได้ดังนี้
SELECT quantity, max(price)
FROM items_ordered
GROUP BY quantity;

3. HAVING

ไวยากรณ์

HAVING clause
SELECT column1, SUM(column2 )
FROM list-of-tables
GROUP BY column-list
HAVING condition ;
HAVING clause ยินยอมให้ระบุเงื่อนไขบนแถวของแต่ละกลุ่ม หรือสามารถเลือกแถวตามเงื่อนไขที่ระบุ HAVING clause ควรตามหลัง GROUP BY clause

ตัวอย่าง

สมมติให้ table “employee” มีคอลัมน์เก็บข้อมูล ชื่อ (name), ฝ่าย (dept), เงินเดือน (salary) และ อายุ (age) ถ้าต้องการเลือกค่าเฉลี่ยเงินเดือนของพนักงานในแต่ละฝ่าย สามารถใช้คำสั่งนี้
SELECT dept, avg(salary)
FROM employee
GROUP BY dept;

4. ORDER BY

ไวยากรณ์

ORDER BY clause
SELECT column1, SUM(column2 )
FROM list-of-tables
ORDER BY olumn-list  [ASC | DESC];
[ ] ตัวเลือก
ORDER BY clause เป็น clause ตัวเลือกซึ่งยินยอมให้แสดงผลลัพธ์ของคิวรี่ที่เรียงลำดับ (ทั้งเรียงลำดับจากน้อยไปมาก หรือ จากมากไปน้อย) ตามคอลัมน์ที่ระบุให้เรียงลำดับ
ASC = Ascending order (เรียงลำดับจากน้อยไปมาก) - เป็นค่าเริ่มต้น
DESC = Descending order (เรียงลำดับจากมากไปน้อย)

ตัวอย่าง

SELECT employee_id, dept, name, age, salary
FROM employee
WHERE dept = 'Sales'
ORDER BY salary;
ประโยคคำสั่งนี้จะเลือก employee_id, dept, name, age และ salary จาก table “employee” ที่ค่า dept เท่ากับ ‘Sales’ และแสดงผลลัพธ์ในลำดับจากน้อยไปมากตาม salary
ถ้าต้องการเรียงลำดับแบบหลายคอลัมน์ ต้องแยกคอลัมน์ด้วยเครื่องหมายจุลภาค
SELECT employee_id, dept, name, age, salary
FROM employee
WHERE dept = 'Sales'
ORDER BY salary, age DESC;

5. การรวมเงื่อนไข และ Boolean Operator

AND operator

AND operator ใช้เชื่อม 2 เงื่อนไข หรือมากกว่าและแสดงผลลัพธ์เฉพาะที่สอดคล้องกับเงื่อนไขที่กำหนดทั้งหมด

ไวยากรณ์

AND operator
SELECT column1, SUM(column2 )
FROM list-of-tables
WHERE condition1  AND condition2 ;
AND สามารถใช้เชื่อมเงื่อนไขใน WHERE clause ตั้งแต่ 2 เงื่อนไขขึ้นไป โดยการแสดงแถวข้อมูลตามเงื่อนไขต้องเป็นจริงทุกค่า

ตัวอย่าง

SELECT employee_id, name, title, salary
FROM employee
WHERE salary >= 50000.00 AND title = 'Programmer';
ประโยคคำสั่งนี้แสดงข้อมูล employee_id, name, title และ salary จาก table “employee” ที่เงินเดือน (salary) มากกว่าหรือเท่ากับ 50,000 และ ตำแหน่ง (title) เท่ากับ Programmer’ ซึ่งข้อมูลสามารถแสดงออกมา เมื่อเงื่อนไขทั้งสองเป็นจริง ถ้าเงื่อนไขใดเงื่อนไขหนึ่งเป็นจริงจะไม่แสดงออกมา

6. IN และ BETWEEN

IN

ไวยากรณ์

IN conditional operator
SELECT column1, SUM(column2 )
FROM list-of-tables
WHERE column3  IN (list-of-values );
IN เป็น operator ที่ใช้ทดสอบข้อมูลกับชุดของสมาชิก โดยทดสอบว่าค่าในคอลัมน์ (ที่ระบุก่อนคีย์เวิร์ด IN) อยู่ในรายการของค่าที่กำหนดให้หลังคีย์เวิร์ด IN

ตัวอย่าง

SELECT employee_id, name, salary
FROM employee
WHERE name IN ('Somchai', 'Sompong', 'Wanchai', 'Pornchai');
ประโยคคำสั่งนี้แสดงข้อมูล employee_id, name และ salary จาก table “employee” เฉพาะชื่อ (name) เป็นชื่อใดชื่อหนึ่งของ 'Somchai', 'Sompong', 'Wanchai', 'Pornchai' ผลลัพธ์แสดงแถวข้อมูลจากการส่งออกค่าใดค่าหนึ่งในค่าเหล่านี้
IN สามารถเขียนในรูปของ OR ได้ดังนี้
SELECT employee_id, name, salary
FROM employee
WHERE (name = 'Somchai') OR (name = 'Sompong ') OR (name = ' Wanchai') OR (name = 'Pornchai');
NOT IN สามารถใช้ดึงข้อมูลที่ภายนอกค่าของ IN
SELECT employee_id, name, salary
FROM employee
WHERE name NOT IN ('Somchai', 'Sompong', 'Wanchai', 'Pornchai');

BETWEEN

ไวยากรณ์

BETWEEN conditional operator
SELECT column1, SUM(column2 )
FROM list-of-tables
WHERE column3  BETWEEN value1  AND value2 ;
BETWEEN ใช้ทอสอบค่า (ที่ระบุก่อนคีย์เวิร์ด BETWEEN) อยู่ภายในช่วงของค่า 2 ค่าที่ระบุหลังคีย์เวิร์ด BETWEEN

ตัวอย่าง

SELECT employee_id, age, name, salary
FROM employee
WHERE age BETWEEN 30 AND 40;
ประโยคคำสั่งนี้เลือก employee_id, age, name และ salary จาก table “employee” ที่ age อยู่ระหว่าง 30 ถึง 40
เขียนประโยคคำสั่งใหม่โดยไม่ใช่ BETWEEN
SELECT employee_id, age, name, salary
FROM employee
WHERE age >= 30 AND age <= 40;
NOT BETWEEN สามารถใช้ดึงข้อมูลที่ภายนอกค่าของ BETWEEN
SELECT employee_id, age, name, salary
FROM employee
WHERE age NOT BETWEEN 30 AND 40;

7. Function

ฟังก์ชันที่ทำงานกับข้อมูลของแต่ละแถว เป็นฟังก์ชันที่สามารถทำงานใช้ประโยชน์ได้ดี แต่ไม่อยู่ในมาตรฐาน ANSI SQL-92 ซึ่งฟังก์ชันเหล่านี้อาจจะมีให้หรือไม่มีให้ขึ้นระบบฐานข้อมูลที่ใช้ ฐานข้อมูลหลักส่วนใหญ่มีให้ใช้

ฟังก์ชัน String

LEFT(<string>,x)ส่งออกตัวอักษรซ้ายสุด x ตัวอักษรของข้อความ เช่น LEFT(‘America’,2) = Am
RIGHT(<string>,x)ส่งออกตัวอักษรขวาสุด x ตัวอักษรของข้อความ เช่น RIGHT(‘America’,2) = ca
UPPER(<string>)แปลงข้อความทั้งหมดให้เป็นตัวอักษรใหญ่ เช่น UPPER(‘america’) = AMERICA
LOWER(<string>)แปลงข้อความทั้งหมดให้เป็นตัวอักษรเล็ก เช่น LOWER(‘AMERICA’)=america
INITCAP(<string>)แปลงข้อความทั้งหมดให้ขึ้นต้นด้วยอักษรตัวใหญ่ เช่น INITCAP(‘america’) = America
LENGTH(<string>)ส่งออกตัวอักษรในข้อความ เช่น LENGTH (‘America’) = 7
<string>||<string>ต่อ 2 ข้อความเป็นข้อความเดียวกัน (concatenated)
SUBSTR(<string>,x,y)ดึงตัวอักษรตั้งแต่ตำแหน่งที่ x จำนวน y ตัวอักษร เช่น SUBSTR(‘ABCDEF’, 3,3) = CDE
NVL(<column>, <value>)ฟังก์ชันที่ใช้เปลี่ยนค่า Null ในคอลัมน์ column ที่ระบุเป็นค่าใหม่ตาม value เช่น NVL(salary,0) หมายถึง ค่าที่เป็น Null ในคอลัมน์ salary ให้เปลี่ยนเป็น ศูนย์

ฟังก์ชันคณิตศาสตร์

ABS(x)ส่งออกค่าสัมบูรณ์ของ x
SIGN(x)ส่งออกค่าเครื่องหมายของ x เป็น -1, 0, or 1 (ค่าลบ, ศูนย์ หรือค่าบวก)
MOD(x,y)modulo - ส่งออกค่าจำนวนเต็มของการหาร x ด้วย y (เหมือนกับ x%y)
FLOOR(x)ส่งออกค่าจำนวนเต็มใหญ่ที่สุดที่น้อยกว่าหรือเท่ากับ x
CEILING(x) or CEIL(x)ส่งออกค่าจำนวนเต็มเล็กที่สุดที่มากกว่าหรือเท่ากับ x
POWER(x,y)ส่งออกค่าของ x ยกกำลัง y
ROUND(x)ส่งออกค่าที่ปรับเป็นจำนวนเต็มที่ใกล้ที่สุดของ x
ROUND(x,d)ส่งออกค่าที่ปรับตามจำนวนตำแหน่งทศนิยมที่ระบุด้วยค่า d
SQRT(x)ส่งออกค่ารากที่ 2 ของ x



ตัวอย่าง

SELECT round(salary), name
FROM employee;
ประโยคคำสั่งนี้ปรับค่า salary ให้เป็นจำนวนเต็มที่ใกล้ที่สุด และ name จาก table “employee”

8. Aggregate Function

Aggregate function ในคำสั่ง SQL ได้แก่
MINส่งออกค่าน้อยที่สุดของคอลัมน์ที่กำหนด
MAXส่งออกค่ามากที่สุดของคอลัมน์ที่กำหนด
SUMส่งออกผลรวมค่าตัวเลขของคอลัมน์ที่กำหนด
AVGส่งออกค่าเฉลี่ยของคอลัมน์ที่กำหนด
COUNTส่งออกผลรวมจำนวนของค่าของคอลัมน์ที่กำหนด
COUNT(*)ส่งออกจำนวนแถวใน table
aggregate function ใช้คำนวณเทียบกับการส่งออกคอลัมน์ของข้อมูลตัวเลขจากประโยคคำสั่ง SELECT ฟังก์ชันกลุ่มนี้ใช้หาผลรวมพื้นฐานของคอลัมน์ที่เจาะจงจากข้อมูลที่เลือกมา การทำงานของฟังก์ชันต้องใช้ GROUP BY clause เพื่อครอบคลุมการทำงาน แต่ฟังก์ชันสามารถใช้ได้โดยไม่มี GROUP BY clause

ตัวอย่าง

SELECT AVG(salary)
FROM employee;
ประโยคคำสั่งจะส่งออกผลลัพธ์ที่เก็บค่าเฉลี่ยของทุกข้อมูลที่ส่งออกมาในคอลัมน์ salary จาก table “employee”

9. JOIN

ไวยากรณ์

SELECT list-of-columns
FROM table1,table2,..
WHERE search-condition1 = search-condition2, ..
สมมติว่า ในการเก็บข้อมูลการซื้อสินค้า ประกอบด้วย 3 table คือ
1. customer_info เก็บรายละเอียดของลูกค้า
2. purchase_order เก็บรายละเอียดรายการสั่งซื้อ
”customer_info”
customer_numberfirstnamelastnameaddresscityprovincezip
”purchases”
customer_numberbuydateitemquantityprice

Key

ในการเชื่อม table ของ SQL มีส่วนสำคัญที่เกี่ยวข้อง คือ Key ซึ่งมีแนวคิด ดังนี้
primary key เป็นคอลัมน์หรือชุดของคอลัมน์ที่ระบุแบบไม่ซ้ำ ตัวอย่างเช่น table “customer_info” มีคอลัมน์ customer_number เป็นคอลัมน์ที่ระบุแบบไม่ซ้ำของ ซึ่งมีความหมาย 2 อย่าง คือ ประการแรก ไม่มีข้อมูล 2 แถวสามารถมี customer_number เดียวกัน ถึงแม้ว่า 2 customer_number มีชื่อแรกและชื่อหลังเหมือนกัน ประการที่ 2 คอลัมน์ customer_number ทำให้มั่นใจว่าลูกค้า 2 รายนี้ไม่มีความสับสนต่อกัน เพราะการค้นหาข้อมูลใช้คอลัมน์ customer_number แทนการใช้ชื่อ
foreign key เป็นคอลัมน์ใน table ที่ primary key อยู่ table อื่น ซึ่งหมายความว่า ข้อมูลในคอลัมน์ foreign key ต้องตรงกับข้อมูลของ primary key ใน table อื่น ใน RDBMS ข้อมูลที่ตรงกัน รู้จักในฐานะ Reference Integrity ตัวอย่างเช่น table “purchases” มีคอลัมน์ customer_number เป็น foreign key โดยมี primary key อยู่ใน table “customer_info”
JOIN ที่กล่าวถึงนี้ เป็น INNER JOIN ซึ่งเป็นประเภทการเชื่อมปกติ

ตัวอย่าง

SELECT employee.employee_id, employee.lastname, employee_sales.comission
FROM employee, employee_sales
WHERE employee.employeeid = employee_sales.employeeid;
ประโยคคำสั่งนี้เลือก employee_id และ lastname จาก table “employee” และ comission จาก table “employee_sales” สำหรับทุกแถวที่ employee_id ใน table “employee” ตรงกับ employee_id ใน table “employee_sales”

10. Sub Query และ UNION

Sub Queries

คิวรี่ย่อย (sub queries) หมายถึง การสร้างประโยคคำสั่ง SELECT ภายในอีก ประโยคคำสั่ง SELECT หนึ่ง ซึ่งมักจะใช้ใน WHERE clause เช่น การเลือกลูกค้าที่ซื้อสินค้าแพงกว่าค่าเฉลี่ย 100
SELECT customer_number
FROM purchases
WHERE price >(SELECT avg(price) + 100 FROM purchases);
คิวรี่ย่อยคำนวณค่าเฉลี่ยของ price แล้วบวก 100 และใช้เป็นค่าอ้างอิง โดยการแสดง customer_number ที่มีค่า price มากกว่าค่าคำนวณจากคิวรี่ย่อย

UNION

UNION เป็นการนำหลายคิวรี่ ให้มาแสดงผลเป็นคิวรี่เดียวที่ใช้คอลัมน์ร่วมกัน
SELECT list-of-column FROM table1
UNION
SELECT list-of-column FROM table2
. . .
UNION
SELECT list-of-column FROM tablen
[ORDER BY columnname];

ตัวอย่าง

SELECT name, phone FROM employee
UNION SELECT lastname, phone FROM customer_info;
ประโยคคำสั่งนี้เลือก name, phone จาก table “employyee” และ lastname, phone จาก table “customer_info” เพื่อแสดงผลคอลัมน์ name เป็นรายชื่อของพนักงานและลูกค้า ส่วนคอลัมน์ phone แสดงหมายเลขโทรศัพท์ของพนักงานและลูกค้า

ที่มา : http://www.widebase.net/database/sql/sqlquery/sqlquery11.shtml


ข้อสอบ O-NET คอมพิวเตอร์

1.   ข้อใดไม่ใช่ ขั้นตอนหลักในการทำงานของคอมพิวเตอร์


    ก.  ประมวลผล            ข.  เก็บข้อมูล  
    ค.  รับข้อมูล                ง.  แสดงผลลัพธ์      
    จ.  นำข้อมูลเข้า (คนที่จะนำข้อมูลเข้าได้ก็คือ User)


2.  หน่วยข้อมูลที่เล็กที่สุดในระบบคอมพิวเตอร์เรียกว่า

     ก.  บิต    ( 1 กับ 0)            ข.  ไบต์      ค. ฟิลด์                              ง.  เร็คคอร์ด
     จ. ไฟล์


3.  ข้อมูลเมื่อผ่านการประมวลผลแล้ว จะได้อะไร

      ก.  Document                ข.   Report      ค.  Information            ง.  Output 
      จ.  Database


4.  สัญญาณในคอมพิวเตอร์เป็นสัญญาณชนิดใด

      ก.  อนาล็อก               ข.  ดิจิตอล   
      ค.  ไฮบริค                  ง.  ไฟฟ้า
      จ. อิเล็กทรอนิกส์


5. สิ่งใดที่หุ่นยนต์ไม่สามารถทำได้

      ก.  การเปิดกล่องระเบิด            ข.  การเลือกผลไม้
      ค.  การก่อการร้าย                 ง.  การปอกเลือกไข่ต้ม  
      จ.  การเก็บกู้ระเบิด



6.  IP Address คือ

      ก.  หมายเลยประจำตัวเครื่องคอมพิวเตอร์ต่างๆ ที่เชื่อมต่ออยู่ในเครือข่าย
      ข.  โพรโทคอลที่ใช้ในการเชื่อมโยงเครือข่ายอินเทอร์เน็ต
      ค.  หมายเลขประจำของเครื่องเซิร์ฟเวอร์
      ง.  ที่อยู่บนอินเทอร์เน็ต
      จ. ถูกทุกข้อ


7. ข้อใดกล่าวถึง Protocol ได้ถูกต้อง

        ก.  การสืบค้นข้อมูลบนอินเทอร์เน็ต
        ข. การใช้เครื่องคอมพิวเตอร์ที่อยู่ห่างไกล
        ค.  การบริหารวารสารและข่าวสารบนอินเทอร์เน็ต
        ง. เครื่องมือที่ช่วยในการสืบค้นข้อมูลในรูปแบบเอกสาร
        จ.  ภาษาการสื่อสารระหว่างเครื่องคอมพิวเตอร์ในระบบอินเทอร์เน็ต


8.  ส่วนประกอบใดของโปรแกรม Internet Explorer ที่ทำหน้าที่แสดงที่อยู่ของเว็ปไซด์

       ก.  แถบชื่อ                       ข.  แถบสื่อสาร           ค.  แถบสถานะ                 ง.  พื้นที่แสดงเว็บเพจ
     จ. แถบที่อยู่ของเว็บไซต์


9.   s15550036@student.rit.ac.th  ข้อความ “s1555036” หมายถึงข้อใด

       ก.  Domain Name            ข.  Password    
       ค.  Sub Domain               ง.  Username    
       จ.  ISP

10. ไฟล์ที่ถูกบีบอัดด้วยโปรแกรม WinZip จะมีส่วนขยายหรือนามสกุลไฟล์ตามข้อใด

       ก.  .doc               ข.  .zip         ค.  .com              ง.  .txt         จ.  .exe


ที่มา : http://tongrod-tongrod.blogspot.com/2012/02/o-net.html

วันพุธที่ 26 พฤศจิกายน พ.ศ. 2557

ฟังก์ชั่นPHP : ฟังก์ชั่นที่สร้างขึ้นมาเอง

        เป็นฟังก์ชั่นที่สร้างขึ้นมาเอง เพื่อให้ทำงานนอกเหนือจากฟังก์ชั่นที่มีอยู่ใน PHPหรือเราต้องการให้โปรแกรมทำงานตรงกับความต้องการของเรา รูปแบบการเขียนฟังก์ชั่นเป็นดังนี้





<?php
    function ชื่อฟังก์ชั่น (ค่าที่ส่งให้) {
        การทำงานของฟังก์ชั่น
    }
?>
ลองดูตัวอย่างการสร้างฟังก์ชั่นชื่อ cmdevhub() กันครับ








<?php
    function cmdevhub() {
        echo "welcome to cmdevhub";
    }

    // เราสามารถเรียกฟังก์ชั่นได้โดยเรียกจากชื่อฟังก์ชั่น

    cmdevhub(); // พิมพ์ welcome to cmdevhub
?>
         การส่งค่าให้ฟังก์ชั่นทำการคำนวนนั้นมี รูปแบบคือ ส่งค่าไปตรงๆ เลย และ ส่งค่าอ้างอิงตำแหน่งของตัวแปรส่วนวิธีการรับค่าของฟังก์ชั่นทำได้โดยใส่ตัวแปรเข้าไปใน ( ) มาดูตัวอย่างกัน

2.1 การส่งค่าโดยตรง











<?php
    function cArea($r) {    // ฟังก์ชั่นหาพื้นที่วงกลม
        echo $r * 22 / 7;
    }
    function sArea($h, $w) {    // ฟังก์ชั่นหาพื้นที่สี่เหลี่ยม
        echo $h * $w;
    }

    cArea(15);  // ผลลัพท์ 47.1428571429
    echo "<br />";
    sArea(3, 15); // ผลลัพธ์ 45
?>
เราสามารถส่งค่าไปให้ฟังก์ชั่นโดยใช้ค่าที่อยู่ในตัวแปรส่งไปได้ด้วย








<?php
    function sArea($h, $w) {
        echo $h * $w;
    }

    $width = 12;
    $height = 3;
    sArea($width, $height);
?>

ถ้าหากส่งค่าให้ฟังก์ชั่นมากเกินกว่าที่ฟังก์ชั่นรับไว้ ค่าที่เกินมา จะไม่ถูกนำไปใช้งาน แต่ถ้าหากส่งค่าไปไม่ครบจะเกิดข้อผิดพลาด Warning: Missing argumentตรงนี้ก็ระวังกันด้วยนะครับ

2.2 การส่งค่าอ้างอิงตำแหน่งตัวแปร
โดยปกติการส่งค่าให้ฟังก์ชั่นจะทำการส่งค่าของตัวแปรนั้นๆ เข้าไปยังฟังก์ชั่นเลย ถ้าหากต้องการผลลัพธ์ของการคำนวนก็ทำการคืนค่า (return) กลับมา แต่เราสามารถเขียนให้ง่ายกว่านั้นได้อีก โดยการส่งตำแหน่ง (address) ของตัวแปรนั้นเข้าไปยังฟังก์ชั่นแทน ก็สามารถทำการคำนวนและเปลี่ยนค่าของตัวแปรที่เราต้องการได้โดยไม่ต้องทำการคืนค่ากลับออกมา ตัวอย่างที่ผมใช้บ่อยและใช้ตลอดก็คือการคำนวนภาษี (ยังหาโปรแกรมอื่นๆ ที่ใช้ฟังก์ชั่นแบบนี้ไม่ได้เลย) ลองดูตัวอย่างกันครับ














<?php
    function cal_tax(&$cost, $tax) {
        $cost += $cost * $tax;
    }

    $cost = 200;
    $tax = 0.07;

    echo "จำนวนเงินก่อนคำนวนภาษี " . $cost; // ผลลัพธ์ 200
    echo "<br />";

    cal_tax($cost, $tax);

    echo "จำนวนเงินหลังคำนวนภาษี " . $cost; // ผลลัพธ์ 214
?>

จะเ้ห็นว่า เราสามารถเปลี่ยนตัวแปร $cost โดยไม่ต้องทำการคืนค่าในฟังก์ชั่นเลย จริงๆ แล้ว ตัวอย่างด้านบนสามารถเขียนได้อีกแบบดังนี้















<?php
    function cal_tax($cost, $tax) {
        $cost += $cost * $tax;
        return $cost;
    }

    $cost = 200;
    $tax = 0.07;

    echo "จำนวนเงินก่อนคำนวนภาษี " . $cost;
    echo "<br />";

    $cost = cal_tax($cost, $tax);

    echo "จำนวนเงินหลังคำนวนภาษี " . $cost;
?>
ซึ่งผลลัพธ์ที่ได้จะเหมือนกันทุกอย่าง แต่การเรียกใช้งานจะไม่เหมือนกัน จุดนี้ก็แล้วแต่ล่ะครับ ว่าจะเลือกใช้วิธีไหน ถ้าหากทำงานเ็ป็นทีม การใช้งานฟังก์ชั่นที่คืนค่ากลับมาจะเข้าใจได้ง่ายกว่า แต่ถ้าหากทำงานไม่กี่คน หรือแค่คนเดียว การอ้างอิงหน่วยความจำจะทำให้โค๊ดสั่นกว่า และเข้าใจยากกว่า (ถ้าหากเราลืม อิอิ) เอาเป็นว่า รู้ไว้เฉยๆ ก็ได้ครับ เพราะบางทีเราอาจจะไม่ได้เขียนฟังก์ชั่นแบบนี้เลยก็ได้ (แต่ลองใช้แล้วจะติดใจ)

2.3 การกำหนดค่าเริ่มต้นให้ฟังก์ชั่น
ในการสร้างฟังก์ชั่นที่ทำการรับค่านั้น เราจำเป็นที่จะต้องส่งค่าให้กับฟังก์ชั่นนั้นๆ จนครบตามจำนวนที่กำหนดไว้ ถ้าหากส่งค่าไม่ครบจะเกิดข้อผิด Warning: Missing argument ขึ้น หรือ ถ้าเราต้องการสร้างฟังก์ชั่นที่เรารู้ค่าที่ใช้คำนวณอยู่แล้ว เช่นฟังก์ชั่นที่คิดภาษีที่เรารู้อยู่แล้วว่าต้องคิดที่ 7% แต่ต้องการให้สามารถเปลี่ยนค่าได้โดยที่ไม่ต้องแก้ไขฟังก์ชั่นใหม่ ก็สามารถทำการกำหนดค่าเริ่มต้นขึ้นมาได้เลย ลองดูตัวอย่างกัน












<?php
    function cal_tax(&$cost, $tax = 0.07) {
        $cost += $cost * $tax;
    }
    $cost = $cost1 = 200;
    echo "จำนวนเงินก่อนคำนวนภาษี " . $cost;
    echo "<br />";
    cal_tax($cost);
    echo "จำนวนเงินหลังคำนวณภาษี " . $cost;
    echo "<hr />";
    echo "คิดภาษีที่ 10%";
    echo "<br />";
    echo "จำนวนเงินก่อนคำนวณภาษี " . $cost1;
    echo "<br />";
    cal_tax($cost1, 0.1);
    echo "จำนวนเงินหลังคำนวณภาษี " . $cost1;
    echo "<br />";
?>

จากตัวอย่าง ทำการผสมผสานกันระหว่างการเรียกฟังก์ชั่นโดยใช้อ้างอิงตำแหน่งตัวแปร กับการกำหนดค่าเริ่มต้นให้ฟังก์ชั่น จะเห็นได้ว่า เราเรียกฟังก์ชั่นครั้งแรกโดยไม่ส่งค่าไปแค่ตัวเดียวคือตำแหน่งของตัวแปร $cost เราได้ทำการกำหนดค่าเริ่มต้นให้ตัวแปร $tax แล้วทำให้ตัวแปร $tax มีค่า 0.07 ตามที่เรากำหนดไว้ แต่พอเรียกครั้งที่สองเราได้ส่งค่า 0.1 ให้กับตัวแปร $tax ด้วย ทำให้ค่าของตัวแปร $tax ถูกเปลี่ยนจาก 0.07 เป็น 0.1 แทน

2.4 การคืนค่าของฟังก์ชั่น
ในการสร้างฟังก์ชั่นขึ้นมาใช้งานนั้น ถ้าหากไม่มีการส่งค่ากลับคืนมาเมื่อทำงานเสร็จ ฟังก์ชั้นนั้นก็แทบจะไม่มีประโยชน์อะไรเลย เนื่องจากไม่สามารถนำค่าที่ฟังก์ชั่นคำนวนได้กลับมาใช้งาน การคืนค่าของฟังก์ชั่น สามารถทำได้โดยใช้คำสั่ง returnโดยสามารถคืนค่าจากผลลัพธ์การคำนวณได้หนึ่งค่า หรือถ้าต้องการคืนหลายๆ ค่าพร้อมกัน สามารถใช้ตัวแปรแบบ array หรือ list ก็ได้ ลองดูตัวอย่างกันครับ
การคืนค่าหนึ่งค่า

<?php
    function cal_tax($cost, $tax = 0.07) {
        $cost += $cost * $tax;
        return $cost;
    }

    $cost = 200;
    echo "ค่าก่อนคำนวนภาษี " . $cost;
    $cost = cal_tax($cost);
    echo "<br />";
    echo "ค่าหลังคำนวนภาษี " . $cost;
?>

การคืนค่าหลายค่าการเรียกใช้งานฟังก์ชั่นที่มีการคืนค่านั้น จำเป็นต้องมีตัวแปร หรือคำสั่งใดๆ รองรับการคืนค่านั้นๆ ไม่เช่นนั้นแล้ว ค่าที่คืนกลับมา ก็ไม่สามารถนำไปใช้งานใดๆ ได้เลย
การคืนค่าหลายๆ นั้น ต้องทำให้ตัวแปรนั้นเป็น array ก่อน โดยจะสร้างให้ตัวแปรนั้นเป็น array หรือใช้คำสั่ง list() ในการรับค่าก็ได้ ตัวอย่างการใช้ฟังก์ชั่น list()

 <?php
    $color = array('red', 'green',' blue');
    list($red, $green, $blue) = $color;
    // ตัวแปร $red เก็บค่า red, $green เก็บค่า green, $blue เก็บค่า blue

?>

ตัวอย่างการใช้งานฟังก์ชั่นที่คืนค่าแบบ array

<?php
    function user() {
        $name[] = "POP EYE";
        $name[] = "shikimasan[a]gmail[dot]com";
        $name[] = "www.cmdevhub.com";
        return $name;
    }
    // รับค่าโดยใช้ฟังก์ชั่น list ต้องทำการสร้างตัวแปรรับค่าให้ตรงกับค่า
ที่คืนกลับมา
    list($name, $email, $web) = user();

    // รับค่าโดยใช้ตัวแปร ทำให้ตัวแปรนั้นถูกเปลี่ยนเป็นแบบ array โดยอัตโนมัติ
    $name = user();

    // การอ้างอิงค่าต้องทำการอ้างอิงจาก index ของ array โดยตรง
    echo $name[0];
    echo $name[1];

?>

2.5 ฟังก์ชั่นซ้อนฟังก์ชั้น (Nesting Function)จากตัวอย่างจะเห็นได้ว่า
เราสามารถรับค่าจากฟังก์ชั่นที่คืนค่าเป็น array ได้ทั้ง 2แบบ แต่ในการใช้งานจริงๆ จะใช้ฟังก์ชั่น list() รับค่ามากกว่า เพราะต้องกำหนดตัวแปรให้กับค่าที่คืนมาแต่ละค่า ซึ่งจะสื่อความหมายมากกว่ารับค่าโดยใช้ตัวแปรและอ้างอิงโดยใช้หมายเลข index อ้างอิงในภาษา PHP เราสามารถสร้างฟังก์ชั่นขึ้นมาภายในฟังก์ชั่นอีกทีได้ แบบตัวอย่าง

<?php
    function cal_tax ($price, $tax) {
        function cal_vat ($total) {
            return $total * 0.07;
        }
        $price += $price * $tax;
        echo "จำนวนเงินทั้งหมดหลังรวมภาษี " . $price . "                  
หลังรวมภาษีมูลค่าเพิ่ม " . ($price + cal_vat($price));
    }
    cal_tax(1500, 0.1); // ผลลัพธ์ 1650 , 1765.5
    echo "<br />";
    echo cal_vat(100);  // ผลลัพธ์ 7

?>

    Nesting Function ของภาษา PHP ไม่มีการกำหนดระดับของการเข้าถึง (scope)
ทำให้ไม่ว่าจะเขียนฟังก์ชั่นไว้ที่ไหนก็สามารถเรียกใช้ได้การเขียนแบบนี้ไม่ค่อยได้ใช้ในชีวิตจริงเท่าไหร่
แต่ก็ให้รู้ไว้ว่าเราสามารถสร้างฟังก์ชั่นแบบนี้ได้ เผื่อเอาไปสอบ CERT นะครับ

2.6 ฟังก์ชั่นเรียกตัวเอง (Recursive Function)
ฟังก์ชั่นเรียกตัวเอง ใช้สำหรับทำงานซ้ำๆ กันโดยที่เราไม่รู้จำนวนรอบในการทำงาน
โดยจะมีจุดสิ้นสุดการทำงานอยู่ในฟังก์ชั่นเองอยู่แล้ว เพื่อให้ฟังก์ชั่นหยุดการทำงาน
การเขียนฟังก์ชั่นแบบเรียกตัวเอง จะลดระยะเวลาในการเขียนโปรแกรมไปได้อย่างมาก
 แต่ปัญหาคือการออกแบบและเขียนได้ยากมาก ทำให้ไม่ค่อยได้เห็นคนเขียนฟังก์ชั่นแบบนี้กันเท่าไหร่
เรามาดูตัวอย่างฟังก์ชั่นเรียกตัวเองที่เขียนกันบ่อยๆ 2ตัวอย่างกัน

<?php


    function fibo($num) {
        if ($num == 1 || $num == 2) {
            return 1;
        }
        else {
            return fibo($num - 1) + fibo($num - 2);
        }
    }

    echo fibo(20);

?>

ตัวอย่างแรกเป็นตัวเลข Fibonacci การใช้งานคือ เรียกฟังก์ชั่น fibo() แล้วใส่ตัวเลขตำแหน่งหลักที่ต้องการเข้าไปเช่น fibo(20) หมายถึงตัวเลขfibonacci ในตำแหน่งที่ 20
<?php
    function fac($num) {
        if ($num == 0 || $num == 1) {
            return 1;
        }
        else {
            return fac($num - 1) * $num;
        }
    }

    echo fac(5);
?>

ตัวอย่างที่สองเป็นตัวเลข Factorial หรือ n! การทำงานก็คล้ายๆ กับfibonacci แต่ผลลัพธ์ที่ได้จะเป็นค่าของ n! เลย
จะเห็นว่า ถ้าหากเราเขียนโปรแกรมแบบปกติ จะต้องมีการใช้คำสั่งวนรอบมาเกี่ยวข้อง แต่ถ้าใช้ฟังก์ชั่นเรียกตัวเองเราไม่ต้องใช้คำสั่งวนรอบเข้ามาเกี่ยวข้องกับการทำงานของฟังก์ชั่นเลย แต่จะต้องมีเงื่อนไขในการจบฟังก์ชั่นที่แน่นอนด้วย