Apichart Nakarungutti
The Cake is a Lie
ใน PHP ตัวแปรเป็นประเภท weak type (ไม่ต้องกำหนดชนิดตัวแปรก่อนกำหนดค่า) และ dynamic type (สามารถเปลี่ยนชนิดตัวแปรได้ด้วยการกำหนดค่าใหม่) โดยมีชนิดตัวแปรหลักอยู่ 8 ชนิด คือ
Boolean ที่เก็บค่า true
(จริง) หรือ false
(เท็จ) โดยไม่คำนึงถึงตัวใหญ่ตัวเล็ก (จะใช้ TRUE
หรือ TrUe
ก็ true
เหมือนกัน) การแปลงเป็น boolean
ใช้ (bool)
หรือ (boolean)
<?php
$tabool = TrUe;
var_dump($tabool); // bool(true)
var_dump( (bool) 1 ); // bool(true)
var_dump( (bool) 0 ); // bool(false)
var_dump( (bool) -1 ); // bool(true)!!!
var_dump( (bool) '' ); // bool(false)
var_dump( (bool) '0' ); // bool(false)!!!
var_dump( (bool) 'a' ); // bool(true)
var_dump( (bool) 'false' ); // bool(true)!
Integer หรือ int เก็บค่าตัวเลข สามารถกำหนดเป็นเลขฐานสิบ ฐานแปด (ขึ้นต้นด้วย 0) ฐานสอง (ขึ้นต้นด้วย 0b — ต้องเป็น PHP5.4+) หรือฐานสิบหก (ขึ้นต้นด้วย 0x) ก็ได้ และกำหนดเครื่องหมาย - เพื่อให้เป็นค่าลบได้ ข้อจำกัดที่ควรรู้เกี่ยวกับ integer คือ ถ้า php ทำงานแบบ 32bit มันจะมีขนาด 32bit แต่ถ้าทำงานบนระบบ 64bit มันจะมีขนาด 64bit ถ้าค่ามีขนาดเกินที่ int จะเก็บได้ PHP จะแปลงชนิดตัวแปรจาก int เป็น float โดยอัตโนมัติ… การแปลงเป็น int ใช้ (int) หรือ (integer) หรือใช้ฟังชั่น intval() ก็ได้
<?php
var_dump( (int) 1234 ); // int(1234)
var_dump( (int) 012 ); // int(10)
var_dump( (int) 01292 ); // int(10) - 92 ด้านหลังถูกตัดออก(เกินตัวเลขสูงสุดที่มีได้ในฐานนั้น ๆ)
var_dump( (int) 0110 ); // int(6)
var_dump( (int) 0xabc ); // int(2748)
var_dump( (int) -0xabc ); // int(-2748)
var_dump( (int) false ); // int(0)
var_dump( (int) true ); // int(1)
Float (บางคนเรียก double) พูดง่าย ๆ คือ ตัวเลขที่มีจุดทศนิยม
<?php
var_dump((float)123); // float(123)
var_dump((float)123.0); // float(123)
var_dump((float)123.4); // float(123.4)
String เก็บข้อความ โดยมี "
(double quoted) หรือ '
(single qouted) ครอบข้อความนั้น ๆ โดย single quoted จะใส่ escape character ได้แค่ \'
และ \\
นอกจากนั้นจะเป็นอย่างที่ใส่ ส่วน double quoted จะสามารถใส่ escape character ได้ครบ และสามารถดึงค่าตัวแปรออกมาแสดงได้ด้วย นอกจากนี้ยังมีกำหนดค่าตัวแปรโดย heredoc และ nowdoc ได้
<?php
$king = 'Nero';
$city = 'Rome';
// print: $king is Nero
echo '$king is ' . $king;
// print: Nero burned Rome
echo "$king burned $city";
Array เก็บค่าเป็นชุด ๆ ใน PHP สามารถเรียกโดยใช้ index ก็ได้ หรือจะใช้แบบ dictionary หรือ associated array (key => value
) ก็ได้ เราสามารถใช้ array
เก็บ array
ได้ด้วยนะ แต่ระวังซ้อนกันเยอะจนงงเอง…
<?php
$fruits = array('Banana','Mango','Orange');
//print: Orange is sweet.
echo $fruits[2] . ' is sweet.';
$digimon = array (
'name' => 'Angelmon',
'type' => 'Angel Digimon',
'from' => 'Patamon',
'partner' => 'Takeru',
);
// print: Takeru is Angelmon's partner
echo $digimon['partner'] . ' is ' . $digimon['name'] . '\'s partner.';
Object เป็น instance ของคลาส โดยทั่วไป เมื่อสร้างคลาสขึ้นมาแล้ว จะต้องสร้าง object ของคลาสเพื่อเรียกใช้งานฟังชั่นต่าง ๆ ภายในคลาสนั้น ๆ
นอกจากนี้ยังมี ชนิดตัวแปรแบบพิเศษอีก 2 ตัวคือ
Resources ซึ่งเป็นข้อมูลที่ได้จากแหล่งภายนอกอย่าง ฐานข้อมูล หรือไฟล์ จะต้องส่งให้ฟังชั่นที่เกี่ยวข้องดึงข้อมูลออกมาก่อนที่จะนำมาแสดงผล
NULL บ่งบอกว่า ไม่มีค่า ตัวแปรนั้น ไม่ได้ถูกกำหนดค่าใด ๆ ไว้ (หรืออีกนัยหนึ่งคือ ยังไม่มีตัวแปรนั้นเกิดขึ้น) สามารถแปลงเป็น NULL
ได้โดย (unset) แต่ตัวแปร และค่าของตัวแปรยังอยู่นะ แค่คืนค่ากลับมาเป็น NULL
เฉย ๆ (ทำไปเพื่อ?)
<?php
$full = 100;
// print: 100
echo $full;
// print: NULL
var_dump( (unset) $full );
// print: 100
echo $full;
นอกจากนั้นยังมี ตัวแปรแบบ pseudo ที่มักเอาไว้เขียนเป็น doc ของฟังชั่นคือ
Mixed เป็นตัวแปรชนิดไหนก็ได้ (แต่ไม่ได้หมายความว่า “ตัวแปรทุกชนิด” นะ)
Number เป็นตัวเลข จะเป็น int หรือ float ก็ไม่เกี่ยง
Callback เป็น string แต่เป็น string ที่บอกชื่อฟังชั่น มักใช้ในฟังชั่นประเภท callback ที่ส่งค่าต่อให้ฟังชั่นที่เกี่ยวข้องทำงาน แล้วส่งค่ากลับมา
เราสามารถตรวจสอบชนิดของตัวแปรโดยใช้ฟังชั่น gettype()
<?php
$unknown_type = 0x648684;
// print: integer
echo gettype($unknown_type);
$it_float = 123.321;
// print: double
echo gettype($it_float);
เราสามารถใช้ var_dump()
ที่แสดงข้อมูลทุกอย่างของตัวแปร และ print_r()
เพื่อแสดงข้อมูลของตัวแปรให้อ่านได้ง่าย ๆ แต่ถ้า แสดงออกมาแล้วยังอ่านไม่รู้เรื่อง เพราะติดกันไปหมดก็ครอบส่วนนั้นด้วยแท็ก <pre>
ครับ
ความแตกต่างระหว่าง var_dump()
และ print_r()
คือ
var_dump()
แสดงชนิด รวมถึงขนาดของตัวแปรในขณะที่ print_r()
ไม่ได้แสดงprint_r()
อ่านเข้าใจง่ายกว่า แต่อาจจะเข้าใจผิดได้ในบางกรณี (ทั้ง string ''
และ false
รวมถึง null
จะแสดงเป็น ช่องว่างทั้งคู่ เป็นต้น)นอกจาก 2 คำสั่งนี้แล้วยังมีคำสั่ง var_export()
อีกคำสั่ง ที่ใช้แสดงข้อมูลออกมา แต่ var_export()
สามารถคัดลอกข้อมูลนี้ไปใช้ในสคริปท์ PHP อื่น ๆ ได้โดยตรง เพราะมันแสดงออกมาเป็นโค้ดที่ถูกต้องของ PHP แต่มันมีข้อเสียอยู่อย่างหนึ่งคือ ไม่สามารถใช้กับข้อมูลที่เป็น recursive ได้
<?php
$mixed = array( 0, 'octocat', 0.0, '', 42, false, true, null);
ผลที่ได้จาก 3 คำสั่ง
<?php
// var_dump()
array(9) {
[0]=> int(0)
[1]=> string(7) "octocat"
[2]=> float(0)
[3]=> string(0) ""
[4]=> int(42)
[5]=> bool(false)
[6]=> bool(true)
[7]=> NULL
}
// print_r()
Array
(
[0] => 0
[1] => octocat
[2] => 0
[3] =>
[4] => 42
[5] =>
[6] => 1
[7] =>
)
// var_export()
array (
0 => 0,
1 => 'octocat',
2 => 0,
3 => '',
4 => 42,
5 => false,
6 => true,
7 => NULL,
)
ใน PHP มีการตรวจสอบค่าเฉพาะของตัวแปรอยู่หลายแบบ ซึ่งบางครั้งก็ดูเหมือนจะซ้ำซ้อนกัน เช่น
empty()
ตัวแปรนั้นว่างเปล่า (0
, ''
, array()
, false
) หรือไม่isset()
ตัวแปรนั้นถูกกำหนดค่าใด ๆ ที่ไม่ใช่ NULL
หรือไม่ <?php
$test_array = array( 0, 0.0, '', '0', 'a', array(), false, 'false', null );
echo "Testing value contain: 0, 0.0, '', '0', 'a', array(), false, 'false', null\n------\n\n";
echo "Will return 'bool(true)' if that variable is empty.\n\n";
for ($i = 0; $i < 9; $i++) {
$check = empty($test_array[$i]);
var_dump($test_array[$i]);
echo " is \n";
var_dump($check);
echo "\n---\n\n";
}
echo "Will return 'bool(true)' if that variable is set.\n\n";
$not_defined = isset( $never_exist );
echo '$never_exist is not define so... ';
var_dump($not_defined);
echo "\nfor other variables in array this is a result\n\n";
for ($i = 0; $i < 9; $i++) {
$check = isset($test_array[$i]);
var_dump($test_array[$i]);
echo " is \n";
var_dump($check);
echo "\n---\n\n";
}
ผลที่ได้จะแสดงความแตกต่างระหว่าง empty()
กับ isset()
ลองสังเกตดูเองนะครับ ; )
แม้ว่า บางอันจะทำให้สับสนไปบ้าง เช่น -1
มีค่าเป็น true
, กำหนดค่าตัวแปรเป็น null
แต่ถูกมองว่า ไม่เคยมีตัวแปรนี้อยู่, หรือเรียกชนิดตัวแปรว่า float
แต่พอสั่งแสดงชนิดตัวแปรกลับแสดงเป็น double
แต่มันก็มีข้อดีของมันอยู่บ้าง หากรู้เท่าทัน และรู้จักนำมาใช้ประโยชน์