ผลต่างระหว่างรุ่นของ "ภาษาพีเอชพี/ประเภทของตัวแปร/ข้อความ"

จาก วิกิตำรา
เนื้อหาที่ลบ เนื้อหาที่เพิ่ม
Zodlicious (คุย | ส่วนร่วม)
→‎การแปลงเป็น string: แก้ไขลิงค์
Nullzerobot (คุย | ส่วนร่วม)
โรบอต: เก็บกวาด
บรรทัดที่ 1: บรรทัดที่ 1:
==String==
== String ==
ชนิด string คือ ข้อความ(กลุ่มตัวอักษร) โดยก่อน PHP 6 ตัวอักษรก็คือ byte ก็คือสามารถมีตัวอักษรได้ 256 แบบเท่านั้น และนี้ก็เลยเป็นเหตุผลที่ว่าทำไม PHP ถึงไม่สนับสนุน Unicode โดยพื้นฐาน
ชนิด string คือ ข้อความ(กลุ่มตัวอักษร) โดยก่อน PHP 6 ตัวอักษรก็คือ byte ก็คือสามารถมีตัวอักษรได้ 256 แบบเท่านั้น และนี้ก็เลยเป็นเหตุผลที่ว่าทำไม PHP ถึงไม่สนับสนุน Unicode โดยพื้นฐาน
*เนื่องจาก PHP ไม่มีการจำกัดขนาดของ string จึงมักไม่มีปัญหากับ string ขนาดใหญ่ แต่ว่าขนาดของ string นั้นก็ถูกจำกัดด้วยเมโมรี่ของเครื่องที่รัน PHP อยู่
* เนื่องจาก PHP ไม่มีการจำกัดขนาดของ string จึงมักไม่มีปัญหากับ string ขนาดใหญ่ แต่ว่าขนาดของ string นั้นก็ถูกจำกัดด้วยเมโมรี่ของเครื่องที่รัน PHP อยู่
===รูปแบบการใช้งาน===
=== รูปแบบการใช้งาน ===
การกำหนดค่า string นั้นทำได้ 4 แบบ
การกำหนดค่า string นั้นทำได้ 4 แบบ
#[[#เครื่องหมายคำพูดเดียว (')|ประกาศโดยใช้เครื่องหมายคำพูดเดียว]]
# [[#เครื่องหมายคำพูดเดียว (')|ประกาศโดยใช้เครื่องหมายคำพูดเดียว]]
#[[#เครื่องหมายคำพูดคู่ (")|ประกาศโดยใช้เครื่องหมายคำพูดคู่]]
# [[#เครื่องหมายคำพูดคู่ (")|ประกาศโดยใช้เครื่องหมายคำพูดคู่]]
#[[#Heredoc|ประกาศโดยใช้รูปแบบของ heredoc]]
# [[#Heredoc|ประกาศโดยใช้รูปแบบของ heredoc]]
#[[#Nowdoc|ประกาศโดยใช้รูปแบบของ nowdoc]]
# [[#Nowdoc|ประกาศโดยใช้รูปแบบของ nowdoc]]
====เครื่องหมายคำพูดเดียว (')====
==== เครื่องหมายคำพูดเดียว (') ====
วิธีเรียบง่ายที่สุดในการกำหนด string คือ ล้อมรอบไว้ด้วยเครื่องหมายคำพูดเดียว (')<br/>
วิธีเรียบง่ายที่สุดในการกำหนด string คือ ล้อมรอบไว้ด้วยเครื่องหมายคำพูดเดียว (')


ถ้าต้องการใช้เครื่องหมาย ' ในข้อความนั้นก็ให้ใช้ \ นำหน้า ส่วนถ้าต้องการใช้เครื่องหมาย \ ก็ให้ใส่เป็น \\ โดยถ้าหากทำแบบนี้กับตัวอักขระอื่นที่ไม่ใช่ 2 ตัวนี้ก็จะมีการแสดง \ ออกมาด้วย
ถ้าต้องการใช้เครื่องหมาย ' ในข้อความนั้นก็ให้ใช้ \ นำหน้า ส่วนถ้าต้องการใช้เครื่องหมาย \ ก็ให้ใส่เป็น \\ โดยถ้าหากทำแบบนี้กับตัวอักขระอื่นที่ไม่ใช่ 2 ตัวนี้ก็จะมีการแสดง \ ออกมาด้วย
*ไม่เหมือนอีก 3 รูปแบบ เพราะว่า '''ตัวแปร''' และ '''escape sequences สำหรับตัวอักขระพิเศษ'''จะไม่ถูก ขยาย เวลาอยู่ใน (')
* ไม่เหมือนอีก 3 รูปแบบ เพราะว่า '''ตัวแปร''' และ '''escape sequences สำหรับตัวอักขระพิเศษ'''จะไม่ถูก ขยาย เวลาอยู่ใน (')
<source lang="php">
<source lang="php">
<?php
<?php
บรรทัดที่ 36: บรรทัดที่ 38:
?>
?>
</source>
</source>
====เครื่องหมายคำพูดคู่ (")====
==== เครื่องหมายคำพูดคู่ (") ====
ถ้าหาก string ถูกครอบด้วย (") แล้ว จะสามารถใช้งาน escape sequences ได้มากขึ้น
ถ้าหาก string ถูกครอบด้วย (") แล้ว จะสามารถใช้งาน escape sequences ได้มากขึ้น
{|style="border: 1px dashed #8a8a8a; background:white"
{|style="border: 1px dashed #8a8a8a; background:white"
|style="background:#e1e1e1" | สัญลักษณ์
| style="background:#e1e1e1" | สัญลักษณ์
|style="background:#e1e1e1" |ความหมาย
| style="background:#e1e1e1" |ความหมาย
|-
|-
|\n || linefeed (LF or 0x0A (10) in ASCII)
| \n || linefeed (LF or 0x0A (10) in ASCII)
|-
|-
|\r || carriage return (CR or 0x0D (13) in ASCII)
| \r || carriage return (CR or 0x0D (13) in ASCII)
|-
|-
|\t || horizontal tab (HT or 0x09 (9) 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)
| \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)
| \f || form feed (FF or 0x0C (12) in ASCII) (since PHP 5.2.5)
|-
|-
|\\ || backslash
| \\ || backslash
|-
|-
|\$ || dollar sign
| \$ || dollar sign
|-
|-
|\" || double-quote
| \" || double-quote
|-
|-
|\[0-7]{1,3} || the sequence of characters matching the regular expression is a character in octal notation
| \[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
| \x[0-9A-Fa-f]{1,2} || the sequence of characters matching the regular expression is a character in hexadecimal notation
|}
|}
เช่นเดียวกันกับ (') ถ้ามีการใช้ \ กับตัวอักขระอื่น จะมีการแสดง \ ออกมาด้วย
เช่นเดียวกันกับ (') ถ้ามีการใช้ \ กับตัวอักขระอื่น จะมีการแสดง \ ออกมาด้วย
บรรทัดที่ 72: บรรทัดที่ 74:
?>
?>
</source>
</source>
*โดยการใช้ (") ตัวแปรจะได้รับขยาย(ถูกแปลงเป็นค่าที่ตัวแปรนั้นเก็บไว้)
* โดยการใช้ (") ตัวแปรจะได้รับขยาย(ถูกแปลงเป็นค่าที่ตัวแปรนั้นเก็บไว้)
====Heredoc====
==== Heredoc ====
รูปแบบการใช้งานคือ <<< หลังจาก operator นี้ก็ใส่ identifier จากนั้นขึ้นบรรทัดใหม่ แล้วก็เป็นข้อความ และปิดท้ายด้วย identifier เดียวกัน อ่านแล้วอาจจะงงดูตัวอย่างจะง่ายกว่า
รูปแบบการใช้งานคือ <<< หลังจาก operator นี้ก็ใส่ identifier จากนั้นขึ้นบรรทัดใหม่ แล้วก็เป็นข้อความ และปิดท้ายด้วย identifier เดียวกัน อ่านแล้วอาจจะงงดูตัวอย่างจะง่ายกว่า
<source lang="php">
<source lang="php">
บรรทัดที่ 83: บรรทัดที่ 85:
?>
?>
</source>
</source>
*โดย Closing identifier นั้นต้องอยู่'''ตัวแรกสุด'''ในบรรทัด แบบไม่มีเว้นวรรค หรืออะไรมากั้นข้างหน้า และ'''ไม่มีตัวอักขระอื่นนอกเหนือจาก semicolon (;)'''
* โดย Closing identifier นั้นต้องอยู่'''ตัวแรกสุด'''ในบรรทัด แบบไม่มีเว้นวรรค หรืออะไรมากั้นข้างหน้า และ'''ไม่มีตัวอักขระอื่นนอกเหนือจาก semicolon (;)'''
ข้อความแบบ Heredoc ก็เหมือนกับ ข้อความแบบ Double-quoted แบบไม่มีเครื่องหมาย (") นั้นหมายความว่าข้อความใน Heredoc ไม่จำเป็นต้องมีการใช้ escape แต่ว่าก็ สามารถใช้ได้ และ ตัวแปรในข้อความจะถูกแปลง
ข้อความแบบ Heredoc ก็เหมือนกับ ข้อความแบบ Double-quoted แบบไม่มีเครื่องหมาย (") นั้นหมายความว่าข้อความใน Heredoc ไม่จำเป็นต้องมีการใช้ escape แต่ว่าก็ สามารถใช้ได้ และ ตัวแปรในข้อความจะถูกแปลง
<source lang="php">
<source lang="php">
บรรทัดที่ 96: บรรทัดที่ 98:
class foo
class foo
{
{
var $foo;
var $foo;
var $bar;
var $bar;


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


บรรทัดที่ 117: บรรทัดที่ 119:
</source>
</source>
Outputs:
Outputs:
My name is "MyName". I am printing some Foo.
My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
Now, I am printing some Bar2.
This should print a capital 'A': A
This should print a capital 'A': A
*สามารถนำ heredoc เป็น argument ของ function ได้
* สามารถนำ heredoc เป็น argument ของ function ได้
*heredoc เริ่มต้นใช้งานใน PHP4
* heredoc เริ่มต้นใช้งานใน PHP4
====Nowdoc====
==== Nowdoc ====
nowdoc ก็เหมือนกับ heredoc แต่เป็นรูปแบบของ Single-quoted (') แทน <br/>รูปแบบการใช้งานจะต่างกันตรงที่ identifier ตัวเปิดจะต้องใส่ ' ครอบไว้ด้วย
nowdoc ก็เหมือนกับ heredoc แต่เป็นรูปแบบของ Single-quoted (') แทน <br/>รูปแบบการใช้งานจะต่างกันตรงที่ identifier ตัวเปิดจะต้องใส่ ' ครอบไว้ด้วย
<source lang="php">
<source lang="php">
<?php
<?php
$a = <<<'EOD'
$a = <<<'EOD'
This type of declare can be in multiline
This type of declare can be in multiline
but this kind of declare is no need to escepe
but this kind of declare is no need to escepe
EOD;
EOD;
บรรทัดที่ 134: บรรทัดที่ 136:
class foo
class foo
{
{
public $foo;
public $foo;
public $bar;
public $bar;


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


บรรทัดที่ 155: บรรทัดที่ 157:
</source>
</source>
Outputs:
Outputs:
My name is "$name". I am printing some $foo->foo.
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
This should not print a capital 'A': \x41


===การแปลงตัวแปรในข้อความ===
=== การแปลงตัวแปรในข้อความ ===
เมื่อใช้ (") หรือ heredoc ในการกำหนดค่า string จะมีการแปลงตัวแปรภายใน<br/><br/>จะมีรูปแบบการใช้งาน 2 รูปแบบคือ [[#แบบง่าย|แบบง่าย]] และ [[#แบบซับซ้อน|แบบซับซ้อน]]
เมื่อใช้ (") หรือ heredoc ในการกำหนดค่า string จะมีการแปลงตัวแปรภายใน<br/><br/>จะมีรูปแบบการใช้งาน 2 รูปแบบคือ [[#แบบง่าย|แบบง่าย]] และ [[#แบบซับซ้อน|แบบซับซ้อน]]
====แบบง่าย====
==== แบบง่าย ====
ถ้ามีการเจอ $ ในข้อความ PHP parser จะทำการหาชื่อตัวแปรที่เป็นไปได้ แล้วนำค่าของตัวแปรนั้นแทนที่ลงในข้อความ หรือจะครอบตัวแปรด้วย { } เพื่อเจาะจงชื่อตัวแปรก็ได้
ถ้ามีการเจอ $ ในข้อความ PHP parser จะทำการหาชื่อตัวแปรที่เป็นไปได้ แล้วนำค่าของตัวแปรนั้นแทนที่ลงในข้อความ หรือจะครอบตัวแปรด้วย { } เพื่อเจาะจงชื่อตัวแปรก็ได้
<source lang="php">
<source lang="php">
บรรทัดที่ 205: บรรทัดที่ 207:
?>
?>
</source>
</source>
====แบบซับซ้อน====
==== แบบซับซ้อน ====
ที่เรียกว่าแบบซับซ้อน ไม่ใช่เพราะมันรูปแบบซับซ้อน แต่เพราะสามารถใช้งานได้ซับซ้อนกว่า<br/> <br/>
ที่เรียกว่าแบบซับซ้อน ไม่ใช่เพราะมันรูปแบบซับซ้อน แต่เพราะสามารถใช้งานได้ซับซ้อนกว่า<br/>


ในความจริงแล้วค่าทุกค่าใน namespace สามารถใช้งานใน ข้อความ ได้เหมือนอย่างที่ใช้งานนอกข้อความ โดยต้องครอบไว้ด้วย {$ }
ในความจริงแล้วค่าทุกค่าใน namespace สามารถใช้งานใน ข้อความ ได้เหมือนอย่างที่ใช้งานนอกข้อความ โดยต้องครอบไว้ด้วย {$ }
<source lang="php">
<source lang="php">
บรรทัดที่ 223: บรรทัดที่ 227:


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


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


// ใช้งานได้ เมื่อยู่ในข้อความ
// ใช้งานได้ เมื่อยู่ในข้อความ
// ทุกครั้งที่อ้างถึง array หลายมิติ ให้ครอบไว้ด้วย {$ } เสมอ
// ทุกครั้งที่อ้างถึง array หลายมิติ ให้ครอบไว้ด้วย {$ } เสมอ
echo "This works: {$arr['foo'][3]}";
echo "This works: {$arr['foo'][3]}";
บรรทัดที่ 249: บรรทัดที่ 253:
?>
?>
</source>
</source>
*ใน PHP5 ขึ้นไป Function และ Method สามารถใช้งานใน {$ } ได้
* ใน PHP5 ขึ้นไป Function และ Method สามารถใช้งานใน {$ } ได้
===การเข้าถึงและแก้ไข อักขระ ใน string===
=== การเข้าถึงและแก้ไข อักขระ ใน string ===
มีรูปแบบการใช้งานคล้ายกับ array
มีรูปแบบการใช้งานคล้ายกับ array
<source lang="php">
<source lang="php">
บรรทัดที่ 261: บรรทัดที่ 265:
$third = $str[2];
$third = $str[2];


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


// เปลี่ยนแปลงอักขระตัวสุดท้าย
// เปลี่ยนแปลงอักขระตัวสุดท้าย
บรรทัดที่ 273: บรรทัดที่ 277:
?>
?>
</source>
</source>
*การเข้าถึงตัวแปรชนิดอื่นโดยใช้ [] หรือ {} ค่าที่ได้จะเป็น '''NULL'''
* การเข้าถึงตัวแปรชนิดอื่นโดยใช้ [] หรือ {} ค่าที่ได้จะเป็น '''NULL'''
===การเชื่อมข้อความ===
=== การเชื่อมข้อความ ===
การจะเชื่อมข้อความใส่กันนั้น อาจจะใช้ . (จุด, ดอท) operator เอา
การจะเชื่อมข้อความใส่กันนั้น อาจจะใช้ . (จุด, ดอท) operator เอา
<source lang="php">
<source lang="php">
บรรทัดที่ 282: บรรทัดที่ 286:
?>
?>
</source>
</source>
===การแปลงเป็น string===
=== การแปลงเป็น string ===
การแปลงค่าเป็น string นั้นสามารถทำได้โดยใช้ (string) แปลงหรือใช้ strval() การแปลงค่าเป็น string จะเกิดขึ้นโดยอัตโนมัติเมื่อจำเป็นต้องใช้ อย่างที่เป็นใน echo() หรือ print() หรือเมื่อมีการนำค่าชนิดอื่นมาเทียบกับค่า string<br/><br/>
การแปลงค่าเป็น string นั้นสามารถทำได้โดยใช้ (string) แปลงหรือใช้ strval() การแปลงค่าเป็น string จะเกิดขึ้นโดยอัตโนมัติเมื่อจำเป็นต้องใช้ อย่างที่เป็นใน echo() หรือ print() หรือเมื่อมีการนำค่าชนิดอื่นมาเทียบกับค่า string<br/>

ค่า [[ภาษาพีเอชพี/ประเภทของตัวแปร/บูลีน|boolean]] '''TRUE''' จะแปลงเป็น ข้อความ "1" และ '''FALSE''' จะแปลงเป็น "" (empty string) ทำให้สามารถแปลงไปกลับระหว่าง boolean และ string ได้<br/><br/>

ค่า [[ภาษาพีเอชพี/คู่มืออ้างอิงภาษา/ประเภทของตัวแปร/จำนวนเต็ม|integer]] หรือ [[ภาษาพีเอชพี/ประเภทของตัวแปร/จำนวนทศนิยม|float]] แปลงเป็น string นั้นก็จะเป็นการแปลงเลขเป็นข้อความ เช่น 50.0 แปลงเป็น "50.0"<br/><br/>
[[ภาษาพีเอชพี/ประเภทของตัวแปร/Arrays|Array]] จะถูกแปลงเป็น ข้อความ "Array" เสมอ เป็นเหตุให้ echo() หรือ print() ไม่สามารถแสงค่าที่เก็บใน array ได้ด้วยตนเอง ต้องใช้รูปแบบที่มีการอ้างอิงถึง ดัชนี(index)<br/><br/>
ค่า [[ภาษาพีเอชพี/ประเภทของตัวแปร/บูลีน|boolean]] '''TRUE''' จะแปลงเป็น ข้อความ "1" และ '''FALSE''' จะแปลงเป็น "" (empty string) ทำให้สามารถแปลงไปกลับระหว่าง boolean และ string ได้<br/>

[[ภาษาพีเอชพี/ประเภทของตัวแปร/Objects|Object]] จะถูกแปลงเป็น ข้อความ "Object" เสมอ<br/><br/>

[[ภาษาพีเอชพี/ประเภทของตัวแปร/Resources|Resource]] จะถูกแปลงเป็น ข้อความ ในรูปแบบ "Resource id #1" โดย ''1'' คือ unique number ที่กำหนดให้ resource โดย PHP ตอนที่รัน<br/><br/>
ค่า [[ภาษาพีเอชพี/คู่มืออ้างอิงภาษา/ประเภทของตัวแปร/จำนวนเต็ม|integer]] หรือ [[ภาษาพีเอชพี/ประเภทของตัวแปร/จำนวนทศนิยม|float]] แปลงเป็น string นั้นก็จะเป็นการแปลงเลขเป็นข้อความ เช่น 50.0 แปลงเป็น "50.0"<br/>


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


[[ภาษาพีเอชพี/ประเภทของตัวแปร/Objects|Object]] จะถูกแปลงเป็น ข้อความ "Object" เสมอ<br/>


[[ภาษาพีเอชพี/ประเภทของตัวแปร/Resources|Resource]] จะถูกแปลงเป็น ข้อความ ในรูปแบบ "Resource id #1" โดย ''1'' คือ unique number ที่กำหนดให้ resource โดย PHP ตอนที่รัน<br/>


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


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


ค่าที่จะได้นั้นขึ้นอยู่กับส่วนเริ่มต้นของ ข้อความ ถ้า ข้อความ ขึ้นต้นด้วย จำนวนที่ถูกต้อง ค่านั้นก็จะเป็น ค่าที่แปลงได้ นอกเหนือจากนั้นจะแปลงได้เป็น 0 (ศูนย์) รูปแบบค่า จำนวนที่ถูกต้อง ก็คืออาจจะขึ้นต้นด้วยเครื่องหมายบวกหรือลบ ตามด้วยตัวเลข(อาจจะมีจุดทศนิยม) แล้วตามด้วย เลขยกกำลัง โดยเลขยกกำลังนั้น คือ e หรือ E ตามด้วยตัวเลข
ค่าที่จะได้นั้นขึ้นอยู่กับส่วนเริ่มต้นของ ข้อความ ถ้า ข้อความ ขึ้นต้นด้วย จำนวนที่ถูกต้อง ค่านั้นก็จะเป็น ค่าที่แปลงได้ นอกเหนือจากนั้นจะแปลงได้เป็น 0 (ศูนย์) รูปแบบค่า จำนวนที่ถูกต้อง ก็คืออาจจะขึ้นต้นด้วยเครื่องหมายบวกหรือลบ ตามด้วยตัวเลข(อาจจะมีจุดทศนิยม) แล้วตามด้วย เลขยกกำลัง โดยเลขยกกำลังนั้น คือ e หรือ E ตามด้วยตัวเลข
<source lang="php">
<source lang="php">
บรรทัดที่ 303: บรรทัดที่ 321:
$foo = 4 + "10.2 Little Piggies"; // float (14.2)
$foo = 4 + "10.2 Little Piggies"; // float (14.2)
$foo = "10.0 pigs " + 1; // float (11)
$foo = "10.0 pigs " + 1; // float (11)
$foo = "10.0 pigs " + 1.0; // float (11)
$foo = "10.0 pigs " + 1.0; // float (11)
?>
?>
</source>
</source>
*ใช้ ord() และ chr() ในการแปลงไปกลับระหว่าง ASCII code กับ อักขระ
* ใช้ ord() และ chr() ในการแปลงไปกลับระหว่าง ASCII code กับ อักขระ

รุ่นแก้ไขเมื่อ 20:13, 14 มกราคม 2556

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 กับ อักขระ