Stringแก้ไข

ชนิด string คือ ข้อความ(กลุ่มตัวอักษร) โดยก่อน PHP 6 ตัวอักษรก็คือ byte ก็คือสามารถมีตัวอักษรได้ 256 แบบเท่านั้น และนี้ก็เลยเป็นเหตุผลที่ว่าทำไม PHP ถึงไม่สนับสนุน Unicode โดยพื้นฐาน

  • เนื่องจาก PHP ไม่มีการจำกัดขนาดของ string จึงมักไม่มีปัญหากับ string ขนาดใหญ่ แต่ว่าขนาดของ string นั้นก็ถูกจำกัดด้วยเมโมรี่ของเครื่องที่รัน PHP อยู่

รูปแบบการใช้งานแก้ไข

การกำหนดค่า string นั้นทำได้ 4 แบบ

  1. ประกาศโดยใช้เครื่องหมายคำพูดเดียว
  2. ประกาศโดยใช้เครื่องหมายคำพูดคู่
  3. ประกาศโดยใช้รูปแบบของ heredoc
  4. ประกาศโดยใช้รูปแบบของ nowdoc

เครื่องหมายคำพูดเดียว (')แก้ไข

วิธีเรียบง่ายที่สุดในการกำหนด string คือ ล้อมรอบไว้ด้วยเครื่องหมายคำพูดเดียว (')
ถ้าต้องการใช้เครื่องหมาย ' ในข้อความนั้นก็ให้ใช้ \ นำหน้า ส่วนถ้าต้องการใช้เครื่องหมาย \ ก็ให้ใส่เป็น \\ โดยถ้าหากทำแบบนี้กับตัวอักขระอื่นที่ไม่ใช่ 2 ตัวนี้ก็จะมีการแสดง \ ออกมาด้วย

  • ไม่เหมือนอีก 3 รูปแบบ เพราะว่า ตัวแปร และ escape sequences สำหรับตัวอักขระพิเศษจะไม่ถูก ขยาย เวลาอยู่ใน (')
<?php
echo 'แบบนี้คือ string ง่าย ๆ';

echo 'คุณสามารที่จะใส่บรรทัดใหม่
ได้โดยการทำแบบนี้
โดยไม่มีการ error';

// Outputs: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// Outputs: This will not expand: \n a newline
echo 'This will not expand: \n a newline';

// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>

เครื่องหมายคำพูดคู่ (")แก้ไข

ถ้าหาก string ถูกครอบด้วย (") แล้ว จะสามารถใช้งาน escape sequences ได้มากขึ้น

สัญลักษณ์ ความหมาย
\n linefeed (LF or 0x0A (10) in ASCII)
\r carriage return (CR or 0x0D (13) in ASCII)
\t horizontal tab (HT or 0x09 (9) in ASCII)
\v vertical tab (VT or 0x0B (11) in ASCII) (since PHP 5.2.5)
\f form feed (FF or 0x0C (12) in ASCII) (since PHP 5.2.5)
\\ backslash
\$ dollar sign
\" double-quote
\[0-7]{1,3} the sequence of characters matching the regular expression is a character in octal notation
\x[0-9A-Fa-f]{1,2} the sequence of characters matching the regular expression is a character in hexadecimal notation

เช่นเดียวกันกับ (') ถ้ามีการใช้ \ กับตัวอักขระอื่น จะมีการแสดง \ ออกมาด้วย

<?php
$a = "Thailand";

echo "This is \p ."; // Outputs: This is \p .

echo "I love $a"; // Outputs: I love Thailand
?>
  • โดยการใช้ (") ตัวแปรจะได้รับขยาย(ถูกแปลงเป็นค่าที่ตัวแปรนั้นเก็บไว้)

Heredocแก้ไข

รูปแบบการใช้งานคือ <<< หลังจาก operator นี้ก็ใส่ identifier จากนั้นขึ้นบรรทัดใหม่ แล้วก็เป็นข้อความ และปิดท้ายด้วย identifier เดียวกัน อ่านแล้วอาจจะงงดูตัวอย่างจะง่ายกว่า

<?php
$a = <<<EOD
This type of declare
can be in multiline
EOD;
?>
  • โดย Closing identifier นั้นต้องอยู่ตัวแรกสุดในบรรทัด แบบไม่มีเว้นวรรค หรืออะไรมากั้นข้างหน้า และไม่มีตัวอักขระอื่นนอกเหนือจาก semicolon (;)

ข้อความแบบ Heredoc ก็เหมือนกับ ข้อความแบบ Double-quoted แบบไม่มีเครื่องหมาย (") นั้นหมายความว่าข้อความใน Heredoc ไม่จำเป็นต้องมีการใช้ escape แต่ว่าก็ สามารถใช้ได้ และ ตัวแปรในข้อความจะถูกแปลง

<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

/* More complex example, with variables. */
class foo
{
    var $foo;
    var $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

Outputs:

My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A
  • สามารถนำ heredoc เป็น argument ของ function ได้
  • heredoc เริ่มต้นใช้งานใน PHP4

Nowdocแก้ไข

nowdoc ก็เหมือนกับ heredoc แต่เป็นรูปแบบของ Single-quoted (') แทน
รูปแบบการใช้งานจะต่างกันตรงที่ identifier ตัวเปิดจะต้องใส่ ' ครอบไว้ด้วย

<?php
$a = <<<'EOD'
This type of declare can be in multiline 
but this kind of declare is no need to escepe
EOD;

/* More complex example, with variables. */
class foo
{
    public $foo;
    public $bar;

    function foo()
    {
        $this->foo = 'Foo';
        $this->bar = array('Bar1', 'Bar2', 'Bar3');
    }
}

$foo = new foo();
$name = 'MyName';

echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
?>

Outputs:

My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41

การแปลงตัวแปรในข้อความแก้ไข

เมื่อใช้ (") หรือ heredoc ในการกำหนดค่า string จะมีการแปลงตัวแปรภายใน

จะมีรูปแบบการใช้งาน 2 รูปแบบคือ แบบง่าย และ แบบซับซ้อน

แบบง่ายแก้ไข

ถ้ามีการเจอ $ ในข้อความ PHP parser จะทำการหาชื่อตัวแปรที่เป็นไปได้ แล้วนำค่าของตัวแปรนั้นแทนที่ลงในข้อความ หรือจะครอบตัวแปรด้วย { } เพื่อเจาะจงชื่อตัวแปรก็ได้

<?php
$beer = 'Heineken';
echo "$beer's taste is great"; // ใช้งานได้ เพราะ ( ' ) นั้นไม่สามารถเป็นชื่อตัวแปรได้
echo "He drank some $beers";   // ไม่สามารถใช้งานได้ เพราะ 's' ทำให้กลายเป็นตัวแปรชื่อ $beers ซึ่งมันไม่มี
echo "He drank some ${beer}s"; // ใช้งานได้
echo "He drank some {$beer}s"; // ใช้งานได้
?>

ถ้าจะใช้กับ array หรือ object จะต้องมีการใช้งานที่ถูกต้อง

<?php
// ตัวอย่างนี้ยกตัวอย่างการใช้ใน ข้อความ
// ถ้าอยู่นอกข้อความไม่ต้องใช้ { } ครอบ

// แสดง Error ทั้งหมด
error_reporting(E_ALL);

$fruits = array('strawberry' => 'red', 'banana' => 'yellow');

// ใช้งานได้ แต่จำไว้ว่ามันจะทำงาน ต่าง ออกไปเมื่ออยู่นอก ข้อความ
echo "A banana is $fruits[banana].";

// ใช้งานได้
echo "A banana is {$fruits['banana']}.";

// ใช้งานได้ แต่ PHP จะมองหา constant ที่ชื่อ banana ก่อน
echo "A banana is {$fruits[banana]}.";

// ไม่สามารถใช้งานได้ ต้องใช้ { } ครอบไว้
echo "A banana is $fruits['banana'].";

// ใช้งานได้
echo "A banana is " . $fruits['banana'] . ".";

// ใช้งานได้
echo "This square is $square->width meters broad.";

// ไม่สามารถใช้งานได้ ดูวิธีแก้ไขได้ในส่วนของ แบบซับซ้อน
echo "This square is $square->width00 centimeters broad.";
?>

แบบซับซ้อนแก้ไข

ที่เรียกว่าแบบซับซ้อน ไม่ใช่เพราะมันรูปแบบซับซ้อน แต่เพราะสามารถใช้งานได้ซับซ้อนกว่า

ในความจริงแล้วค่าทุกค่าใน namespace สามารถใช้งานใน ข้อความ ได้เหมือนอย่างที่ใช้งานนอกข้อความ โดยต้องครอบไว้ด้วย {$ }

<?php
// แสดง Error ทั้งหมด
error_reporting(E_ALL);

$great = 'fantastic';

// ไม่สามารถใช้งานได้ outputs: This is { fantastic}
echo "This is { $great}";

// ใช้งานได้ outputs: This is fantastic
echo "This is {$great}";
echo "This is ${great}";

// ใช้งานได้
echo "This square is {$square->width}00 centimeters broad."; 

// ใช้งานได้
echo "This works: {$arr[4][3]}";

// รูปแบบนี้ผิดเหมือนที่ $foo[bar] ผิดเมื่ออยู่นอก ข้อความ
// จริง ๆ แล้วมันใช้งานได้อยู่ แต่ว่า PHP จะไปมองหา constant ชื่อ foo ก่อน
// แล้วจะเกิด Error - undefined constant
echo "This is wrong: {$arr[foo][3]}"; 

// ใช้งานได้ เมื่อยู่ในข้อความ 
// ทุกครั้งที่อ้างถึง array หลายมิติ ให้ครอบไว้ด้วย {$ } เสมอ
echo "This works: {$arr['foo'][3]}";

// ใช้งานได้
echo "This works: " . $arr['foo'][3];

echo "This works too: {$obj->values[3]->name}";

echo "This is the value of the var named $name: {${$name}}";

echo "This is the value of the var named by the return value of getName(): {${getName()}}";

echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";
?>
  • ใน PHP5 ขึ้นไป Function และ Method สามารถใช้งานใน {$ } ได้

การเข้าถึงและแก้ไข อักขระ ใน stringแก้ไข

มีรูปแบบการใช้งานคล้ายกับ array

<?php
// เอาตัวอักขระตัวแรกของ $str ก็คือ T
$str = 'This is a test.';
$first = $str[0];

// เอาตัวอักขระตัวที่สามของ $str
$third = $str[2];

// เอาตัวอักขระตัวสุดท้ายของ $str 
// เพราะ strlen() ทำการบอกจำนวนตัวอักษรใน string ที่ส่งผ่าน โดยคืนค่าเป็น integer 
// ในที่นี้ก็เลยเทียบได้กับ $str[21-1] ก็คืออักขระ .
$str = 'This is still a test.';
$last = $str[strlen($str)-1]; 

// เปลี่ยนแปลงอักขระตัวสุดท้าย
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';

?>
  • การเข้าถึงตัวแปรชนิดอื่นโดยใช้ [] หรือ {} ค่าที่ได้จะเป็น NULL

การเชื่อมข้อความแก้ไข

การจะเชื่อมข้อความใส่กันนั้น อาจจะใช้ . (จุด, ดอท) operator เอา

<?php
$str = "is a";
echo "This " . $str . " book"; // Outputs: This is a book
?>

การแปลงเป็น stringแก้ไข

การแปลงค่าเป็น string นั้นสามารถทำได้โดยใช้ (string) แปลงหรือใช้ strval() การแปลงค่าเป็น string จะเกิดขึ้นโดยอัตโนมัติเมื่อจำเป็นต้องใช้ อย่างที่เป็นใน echo() หรือ print() หรือเมื่อมีการนำค่าชนิดอื่นมาเทียบกับค่า string

ค่า boolean TRUE จะแปลงเป็น ข้อความ "1" และ FALSE จะแปลงเป็น "" (empty string) ทำให้สามารถแปลงไปกลับระหว่าง boolean และ string ได้

ค่า integer หรือ float แปลงเป็น string นั้นก็จะเป็นการแปลงเลขเป็นข้อความ เช่น 50.0 แปลงเป็น "50.0"

Array จะถูกแปลงเป็น ข้อความ "Array" เสมอ เป็นเหตุให้ echo() หรือ print() ไม่สามารถแสงค่าที่เก็บใน array ได้ด้วยตนเอง ต้องใช้รูปแบบที่มีการอ้างอิงถึง ดัชนี(index)

Object จะถูกแปลงเป็น ข้อความ "Object" เสมอ

Resource จะถูกแปลงเป็น ข้อความ ในรูปแบบ "Resource id #1" โดย 1 คือ unique number ที่กำหนดให้ resource โดย PHP ตอนที่รัน

NULL จะแปลงเป็น empty string เสมอ

แปลง string เป็นเลขแก้ไข

โดยปกติเมื่อมีการแปลง string เป็นเลข จะแปลงเป็น integer แต่ถ้าหากมี '.' , 'e' หรือ 'E' อยู่ในข้อความจะแปลงเป็น float

ค่าที่จะได้นั้นขึ้นอยู่กับส่วนเริ่มต้นของ ข้อความ ถ้า ข้อความ ขึ้นต้นด้วย จำนวนที่ถูกต้อง ค่านั้นก็จะเป็น ค่าที่แปลงได้ นอกเหนือจากนั้นจะแปลงได้เป็น 0 (ศูนย์) รูปแบบค่า จำนวนที่ถูกต้อง ก็คืออาจจะขึ้นต้นด้วยเครื่องหมายบวกหรือลบ ตามด้วยตัวเลข(อาจจะมีจุดทศนิยม) แล้วตามด้วย เลขยกกำลัง โดยเลขยกกำลังนั้น คือ e หรือ E ตามด้วยตัวเลข

<?php
$foo = 1 + "10.5";                //  float (11.5)
$foo = 1 + "-1.3e3";              //  float (-1299)
$foo = 1 + "bob-1.3e3";           //  integer (1)
$foo = 1 + "bob3";                //  integer (1)
$foo = 1 + "10 Small Pigs";       //  integer (11)
$foo = 4 + "10.2 Little Piggies"; //  float (14.2)
$foo = "10.0 pigs " + 1;          //  float (11)
$foo = "10.0 pigs " + 1.0;        //  float (11)     
?>
  • ใช้ ord() และ chr() ในการแปลงไปกลับระหว่าง ASCII code กับ อักขระ