|
บทที่ 5 สำนวนทางภาษา(Expression) |
|
|
|
|
เขียนโดย สุริยา แก้วมุงเมือง
|
|
04 มิ.ย. 2008 23:44น. |
|
สำนวนทางภาษานับว่ามีความสำคัญมากในการสร้างโปรแกรมที่มีประสิทธิภาพของภาษา PHP ในภาษา PHP นั้น โดยมากแล้ว ไม่ว่าสิ่งใดก็ตามคุณจะเขียนในรูปแบบสำนวนทางภาษาหรือ expression(จะขอใช้คำว่า expression แล้วกันนะครับ เพราะเรียกง่ายกว่า) วิธีที่แม่นยำที่ง่ายที่สุดในการนิยาม expression ก็คือ "ไม่ว่าสิ่งใดก็ตามจะมีค่าอยู่ 1 ค่า"
รูปแบบที่เป็นพื้นฐานของ expression ก็คือ ตัวเก็บค่าคงที่(constants) และตัวแปร(variables) เมื่อคุณพิมพ์ "$a = 5" นั้นหมายความว่าคุณกำลังกำหนดค่า '5' ให้กับ $a ค่า '5' นั้นที่เราเห็นๆกันก็คือมีค่าเป็น 5 หรือพูดอย่างหนึ่งก็คือ '5' เป็น expression อันหนึ่ง ที่มีค่าเป็น 5(ในกรณีนี้ '5' เป็นค่าคงที่ที่เป็นจำนวนเต็ม)
หลังจากที่เรากำหนดค่าอย่างนี้แล้ว คุณก็หวังว่าค่าของ $a จะเป็น 5 อย่างไม่มีข้อสงสัย ดังนั้นถ้าคุณเขียน $b = $a คุณก็หวังว่ามันจะพฤติกรรมเหมือนกับว่าคุณได้เขียน $b = 5 หรือพูดอีกอย่างหนึ่ง $a นั้นเป็น expression อันหนึ่งที่มีค่าเป็น 5 อย่างถูกต้อง ถ้าทุกสิ่งทุกอย่างทำงานถูกต้อง มันก็จะเกิดขึ้นแบบนี้จริงๆ
ตัวอย่างที่ดูยุ่งยากขึ้นมานิดนึงสำหรับเรื่อง expression ก็คือเรื่องฟังก์ชั่น ยกตัวอย่าง ให้พิจารณาฟังก์ชั่นต่อไปนี้
<?php function foo () { return 5; } ?>
สมมติว่าคุณคุ้นเคยกับ concept ของฟังก์ขั่นเป็นอย่างดี(ถ้าไม่ใช่ให้เปิดไปดูบทที่เกี่ยวกับเรื่องฟังก์ชั่นครับ) สมมติว่าคุณพิมพ์ว่า $c = foo() โดยพื้นฐานแล้วมันก็จะเหมือนกับ $c = 5 และคุณก็ถูกต้อง ฟังก์ชั้นนั้นเป็น expression ที่มีค่าจากการที่มันคืนค่ากลับมา(return value) ดังนั้น foo() คืนค่า 5 ค่าของ expression 'foo()' จึงเป็น 5 โดยปกติแล้ว ฟังก์ชั่นจะไม่คืนค่าที่เป็นค่าคงตัว แต่ว่าจะคำนวนอะไรบางอย่าง
และแน่นอนที่สุด ค่าต่างๆในภาษา PHP บ่อยครั้งไม่ได้เป็นค่าจำนวนเต็ม PHP นั้นสนับสนุนค่า scalar อยู่ 4 ชนิด คือ ค่าเลขจำนวนเต็ม(integer) เลขทศนิยม(float) สายอักขระ(string) และค่าบูลีน(boolean) (ค่า scalar ก็คือค่าที่คุณจะไม่สามารถแตกออกเป็นชิ้นเล็กๆได้อีก ตัวอย่างเช่น array) PHP สนับสนุนค่าชนิดผสม(ที่ไม่ใช่ scalar)อยู่สองชนิด คือ array และ object ซึ่งแต่ละตัวนั้นสามารถถูกกำหนดให้เป็นตัวแปรที่สามารถถูกคืนค่าได้จากฟังก์ชั่น
ภาษา PHP ใช้ expression เพิ่มมากขึ้นเรื่อย ในบางครั้ง ภาษาอื่นๆหลายๆภาษาก็ทำเหมือนกัน PHP เป็นภาษาที่อ้างอิงตามสำนวน(Expression-Oriented Language) ในแนวคิดที่ว่า ทุกๆสิ่งทุกๆอย่างเป็น expresion หมด ให้พิจารณาตัวอย่างที่เรามีอยู่แล้วข้างต้น '$a = 5' ง่ายมากที่จะเห็นว่า มีค่าอยู่สองค่าที่เกี่ยวข้องกัน คือค่าของเลขจำนวนเต็มคงที่ '5' และค่าของ $a ซึ่งจะถูกเปลี่ยนให้เป็น 5 แต่ว่าในความเป็นจริงแล้วก็คือว่า มันจะมีอยู่อีกหนึ่งค่าที่เกี่ยวข้องเพิ่มเติมมา และค่านั้นก็เป็นค่าที่มันถ่ายค่าให้ตัวมันเอง ค่าที่มันถ่ายให้ตัวเองนั้น จะสมมูลกับค่าที่มันได้รับ ในกรณีนี้คือ 5 จากตัวอย่างมันหมายความว่า '$a = 5' ที่เราไม่ได้คำนึงถึงสิ่งที่มันทำ มันก็เป็น expresion อันหนึ่งที่มีค่าเป็น 5 ดังนั้น การเขียนแบบนี้ '$b = ($a = 5)' มันก็จะเหมือนกับการเขียนแบบนี้ '$a = 5; $b = 5;'(เครื่องหมาย semicolon เป็นเครื่องหมายเพื่อบอกว่าจบบันทัดคำสั่ง) เพราะว่าการให้ค่านั้นจะถูกตรวจไวยากรณ์ให้ถูกต้องตามลำดับไปยังส่วนที่เหลือ คุณสามารถเขียนแบบนี้ได้ '$b = $a = 5'
ตัวอย่างที่ดีอีกอันหนึ่งของเรื่อง expression ก็คือการเพิ่มค่าและการลดค่าทั้งก่อน(pre) และ หลัง(post) ผู้ใช้ภาษา PHP และภาษาอื่นๆอีกหลายๆภาษา อาจจะมีความคลายคลึงกันกับสัญลักษณ์ในรูปแบบ variable++ และ variable-- พวกนี้เป็นตัวดำเนินการเพิ่มค่าและการลดค่า ใน PHP/FI 2 นั้น บันทัดคำสั่ง '$a++' นั้นจะไม่มีค่า(ไม่ได้เป็น expression) ดังนั้นคุณจึงไม่สามารถให้ค่ามันหรือใช้มันในทางอื่นได้ ภาษา PHP ได้มีการปรับปรุงความสามารถของการเพิ่มค่า/การลดค่า โดยการทำพวกนี้ให้เป็น expression เหมือนกับภาษา C ใน PHP นั้น(ที่เหมือนกับ C) จะมีการเพิ่มค่าอยู่สองชนิด คือการเพิ่มค่าก่อน(pre-increment) และการเพิ่มค่าทีหลัง(post-increment) ทั้งสองตัวแล้วโดยพื้นฐานจะเอาไว้ใช้สำหรับเพิ่มค่าตัวแปร และจะมีผลกับตัวแปรที่ระบุ ความแตกแต่งของสองตัวนี้ก็คือค่าของ expression ที่เพิ่ม Pre-increment นั้น ซึ่งจะถูกเขียนได้เป็น '++$variable' มันจะสมมูลกับค่าที่เพิ่ม(PHP จะเพิ่มค่าตัวแปรก่อนที่จะอ่านค่าของมัน ดังนั้นชื่อมันจึงเป็น pre-increment) สำหรับ Post-increment นั้น จะถูกเขียนได้เป็น '$variable++' จะสมมูลกับค่าเริ่มแรกของ $variable ที่ก่อนจะมีการเพิ่มค่า(PHP เพิ่มค่าหลังจากที่มีการอ่านค่าของมันไปแล้ว ดังนั้นจึงเรียกว่า post-increment)
ชนิดโดยทั่วๆไปของ expression คือเป็น expression การเปรียบเทียบ expression พวกนี้จะสมมูลกับถ้าไม่ใช่ค่า FALSE ก็เป็น TRUE ภาษา PHP สนับสนุน > (มากกว่า), >=(มากกว่าหรือเท่ากับ), ==(เท่ากัย), !=(ไม่เท่ากับ), <(น้อยกว่า) และ <=(น้อยกว่าหรือเท่ากับ) ภาษาจะสนับสนุนชุดของตัวดำเนินการที่สมมูลกันแบบเข้มงวดนั่นก็คือ ===(เท่ากันและชนิดเหมือนกัน) และ !==(ไม่เท่ากัน หรือ ชนิดไม่เหมือนกัน) expression พวกนี้เป็นถูกใช้มากภายในการดำเนินการตรวจสอบเงื่อนไข อย่างเช่น if เป็นต้น
ตัวอย่างสุดท้ายของเรื่อง expression ที่เราจะดำเนินการตรงนี้ก็คือการผสม expression ตัวดำเนินการการให้ค่า คุณทรายอยู่แล้วว่า ถ้าคุณต้องการจะเพิ่มค่า $a ไป 1 ค่า คุณสามารถเขียนง่ายเลยแบบนี้ '$a++' หรือ '++$a' แต่ว่าถ้าคุณต้องการเพิ่มมากกว่า 1 ค่า ยกตัวอย่างเช่น 3 คุณสามารถเขียน '$a++' หลายๆ ครั้งได้ แต่ว่าวิธีนี้มันไม่สะดวกสบายในการใช้ ในทางปฏิบัติโดยทั่วไปจะเขียน '$a = $a + 3' ซึ่ง '$a + 3' นั้นจะสมมูลกับค่าของ $a ที่บวกเพิ่มค่าอีก 3 และการให้ค่าอันนี้จะเอาค่ากลับไปเก็บไว้ใน $a ซึ่งเป็นผลลัพธ์ในการเพิ่มค่า $a ด้วย 3 ใน PHP จะเหมือนกับภาษาอื่นๆอีกหลายภาษา เช่น C คุณสามารถเขียนแบบนี้ได้ในรูปแบบสั้น ซึ่งจะชัดเจนกว่าและง่ายต่อการทำความเข้าใจมากกว่า การเพิ่ม 3 ไปยังตัวแปรปัจจุบัน ก็คือ $a สามารถถูกเขียนได้เป็น '$a += 3' แบบนี้หมายความว่า "นำค่าของ $a บวกไป 3 แล้วเก็บที่ $a" ในการเพิ่มค่าจะสั้นกว่าและชัดเจนกว่า ได้ผลลัพธ์ในขณะที่การประมวลผลเร็วกว่า ค่าของ '$a += 3' มันจะเหมือนกับการให้ค่าตามปกติ ให้สังเกตุว่ามันไม่ใช่ 3 แต่ว่ามันจะรวมค่าของ $a บวกด้วย 3 (นี่เป็นค่าที่ถูกให้ไปยัง $a) ตัวดำเนินการสองตำแหน่งใดๆ สามารถถูกใช้ในโหมดนี้ได้ ยกตัวอย่างเช่น '$a -=5'(ลบ 5 จากค่าของ $a), '$b *=7'(คุณค่า $b ด้วย 7) เป็นต้น
มีอยู่อีก expression หนึ่งที่อาจจะดูแปลกๆซักหน่อยถ้าคุณยังไม่เคยเห็นในภาษาอื่นๆ คือในตัวดำเนินการเงื่อนไข
<?php $first ? $second : $third ?>
ถ้าค่าของ expression ย่อยอันแรกเป็นจริง(TRUEหรือไม่ใช่ 0) แล้ว expression ย่อยอันที่สองจะถูกคำนวนค่า และนั่นจะเป็นผลผลลัพธ์ expression ของเงื่อนไข แต่ถ้าค่าของ expression ย่อยอันแรกเป็นเท็จ(FALSE หรือเป็น 0) expression ย่อยอันที่สาม จะถูกคำนวนค่าและเป็นค่าผลลัพธ์ของ expression ของเงื่อนไข
ตัวอย่างต่อไปนี้จะช่วยให้คุณเข้าใจในเรื่อง การเพิ่มค่าก่อนและหลังและ expression ในทั่วๆไป ได้ดียิ่งขึ้น
<?php function double($i) { return $i*2; } $b = $a = 5; /* assign the value five into the variable $a and $b */ $c = $a++; /* post-increment, assign original value of $a (5) to $c */ $e = $d = ++$b; /* pre-increment, assign the incremented value of $b (6) to $d and $e */
/* at this point, both $d and $e are equal to 6 */
$f = double($d++); /* assign twice the value of $d before the increment, 2*6 = 12 to $f */ $g = double(++$e); /* assign twice the value of $e after the increment, 2*7 = 14 to $g */ $h = $g += 10; /* first, $g is incremented by 10 and ends with the value of 24. the value of the assignment (24) is then assigned into $h, and $h ends with the value of 24 as well. */ ?>
expression บางตัว สามารถพิจารณาให้เป็นบันทัดคำสั่ง(statement)ได้ ในกรณีนี้ บันทัดคำสั่งอันนึง จะมีรูปแบบ 'expr' ';' นั่นก็คือ expression นึงที่ตามด้วย semicolon อันนึง และใน '$b=$a=5;' ตรงส่วน $a=5 นั้นเป็น expression ที่ถูกต้อง แต่ว่ามันไม่เป็นบันทัดคำสั่งโดยตัวมันเอง ดังนั้น '$b=$a=5' จึงเป็นบันทัดคำสั่งที่ถูกต้อง
สิ่งที่สุดท้ายที่สำคัญที่จะกล่าวถึงก็คือค่าจริงๆของ expression ในกรณีต่างๆ การประมวลผลเงื่อนไขและการวนซ้ำโดยหลักๆแล้ว คุณไม่ได้สนใจค่าที่ระบุไว้ใน expression แต่ว่าจะใส่ใจแค่ว่ามันมีความหมายว่า TRUE หรือ FALSE เท่านั้น ค่าคงที่ TRUE และ FALSE (case-insensitive)นั้น เป็นค่าบูลีนที่เป็นไปได้สองค่า เมื่อจำเป็น expression อันนึงถูกแปลงเป็นบูลีน โดยอัตโนมัติ ให้ดูบทที่เกี่ยวกับ type-casting สำหรับรายละเอียดวิธีการว่ามันทำอย่างไร
ที่มา : http://www.php.net
กรุณาล็อกอิน หรือลงทะเบียนเพื่อจะเขียนความคิดเห็น |
|
แก้ไขล่าสุดเมื่อ ( 06 มิ.ย. 2008 11:01น. )
|