ตัวแปรต่าง ๆ

ใน PHP ตัวแปรเป็นประเภท weak type (ไม่ต้องกำหนดชนิดตัวแปรก่อนกำหนดค่า) และ dynamic type (สามารถเปลี่ยนชนิดตัวแปรได้ด้วยการกำหนดค่าใหม่) โดยมีชนิดตัวแปรหลักอยู่ 8 ชนิด คือ

Boolean

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

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

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

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

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 แต่มันก็มีข้อดีของมันอยู่บ้าง หากรู้เท่าทัน และรู้จักนำมาใช้ประโยชน์

blog comments powered by Disqus