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

จาก วิกิตำรา
เนื้อหาที่ลบ เนื้อหาที่เพิ่ม
Joojle (คุย | ส่วนร่วม)
ไม่มีความย่อการแก้ไข
Zodlicious (คุย | ส่วนร่วม)
ไม่มีความย่อการแก้ไข
บรรทัดที่ 1: บรรทัดที่ 1:
==String==
'''ข้อความ (String)''' เก็บค่าตัวอักขระ ที่เรียงต่อกันซึ่งสามารถประกาศได้ทั้งหมด 4 รูปแบบ
ชนิด string คือ ข้อความ(กลุ่มตัวอักษร) โดยก่อน PHP 6 ตัวอักษรก็คือ byte ก็คือสามารถมีตัวอักษรได้ 256 แบบเท่านั้น และนี้ก็เลยเป็นเหตุผลที่ว่าทำไม PHP ถึงไม่สนับสนุน Unicode โดยพื้นฐาน
*ประกาศโดยใช้เครื่องหมายคำพูดเดียว (')
*เนื่องจาก PHP ไม่มีการจำกัดขนาดของ string จึงมักไม่มีปัญหากับ string ขนาดใหญ่ แต่ว่าขนาดของ string นั้นก็ถูกจำกัดด้วยเมโมรี่ของเครื่องที่รัน PHP อยู่
===รูปแบบการใช้งาน===
การกำหนดค่า string นั้นทำได้ 4 แบบ
#[[#เครื่องหมายคำพูดเดียว (')|ประกาศโดยใช้เครื่องหมายคำพูดเดียว]]
#[[#เครื่องหมายคำพูดคู่ (")|ประกาศโดยใช้เครื่องหมายคำพูดคู่]]
#[[#Heredoc|ประกาศโดยใช้รูปแบบของ heredoc]]
#[[#Nowdoc|ประกาศโดยใช้รูปแบบของ nowdoc]]
====เครื่องหมายคำพูดเดียว (')====
วิธีเรียบง่ายที่สุดในการกำหนด string คือ ล้อมรอบไว้ด้วยเครื่องหมายคำพูดเดียว (')<br/>
ถ้าต้องการใช้เครื่องหมาย ' ในข้อความนั้นก็ให้ใช้ \ นำหน้า ส่วนถ้าต้องการใช้เครื่องหมาย \ ก็ให้ใส่เป็น \\ โดยถ้าหากทำแบบนี้กับตัวอักขระอื่นที่ไม่ใช่ 2 ตัวนี้ก็จะมีการแสดง \ ออกมาด้วย
*ไม่เหมือนอีก 3 รูปแบบ เพราะว่า '''ตัวแปร''' และ '''escape sequences สำหรับตัวอักขระพิเศษ'''จะไม่ถูก ขยาย เวลาอยู่ใน (')
<source lang="php">
<source lang="php">
<?php
<?php
echo 'แบบนี้คือ string ง่าย ๆ';
$a = 'Thailand';

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';
?>
?>
</source>
</source>
*ประกาศโดยใช้เครื่องหมายคำพูดคู่ (")
====เครื่องหมายคำพูดคู่ (")====
ถ้าหาก string ถูกครอบด้วย (") แล้ว จะสามารถใช้งาน escape sequences ได้มากขึ้น
{|style="border: 1px dashed #8a8a8a; background:white"
|style="background:#e1e1e1" | สัญลักษณ์
|style="background:#e1e1e1" |ความหมาย
|-
|\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
|}
เช่นเดียวกันกับ (') ถ้ามีการใช้ \ กับตัวอักขระอื่น จะมีการแสดง \ ออกมาด้วย
<source lang="php">
<source lang="php">
<?php
<?php
$a = "Thailand";
$a = "Thailand";

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

echo "I love $a"; // Outputs: I love Thailand
?>
?>
</source>
</source>
*โดยการใช้ (") ตัวแปรจะได้รับขยาย(ถูกแปลงเป็นค่าที่ตัวแปรนั้นเก็บไว้)
*ประกาศโดยใช้รูปแบบของ heredoc
====Heredoc====
รูปแบบการใช้งานคือ <<< หลังจาก operator นี้ก็ใส่ identifier จากนั้นขึ้นบรรทัดใหม่ แล้วก็เป็นข้อความ และปิดท้ายด้วย identifier เดียวกัน อ่านแล้วอาจจะงงดูตัวอย่างจะง่ายกว่า
<source lang="php">
<source lang="php">
<?php
<?php
บรรทัดที่ 21: บรรทัดที่ 83:
?>
?>
</source>
</source>
*โดย Closing identifier นั้นต้องอยู่'''ตัวแรกสุด'''ในบรรทัด แบบไม่มีเว้นวรรค หรืออะไรมากั้นข้างหน้า และ'''ไม่มีตัวอักขระอื่นนอกเหนือจาก semicolon (;)'''
*ประกาศโดยใช้รูปแบบของ nowdoc
ข้อความแบบ Heredoc ก็เหมือนกับ ข้อความแบบ Double-quoted แบบไม่มีเครื่องหมาย (") นั้นหมายความว่าข้อความใน Heredoc ไม่จำเป็นต้องมีการใช้ escape แต่ว่าก็ สามารถใช้ได้ และ ตัวแปรในข้อความจะถูกแปลง
<source lang="php">
<?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;
?>
</source>
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 (') แทน <br/>รูปแบบการใช้งานจะต่างกันตรงที่ identifier ตัวเปิดจะต้องใส่ ' ครอบไว้ด้วย
<source lang="php">
<source lang="php">
<?php
<?php
บรรทัดที่ 28: บรรทัดที่ 130:
but this kind of declare is no need to escepe
but this kind of declare is no need to escepe
EOD;
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;
?>
?>
</source>
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 จะมีการแปลงตัวแปรภายใน<br/><br/>จะมีรูปแบบการใช้งาน 2 รูปแบบคือ [[#แบบง่าย|แบบง่าย]] และ [[#แบบซับซ้อน|แบบซับซ้อน]]
====แบบง่าย====
ถ้ามีการเจอ $ ในข้อความ PHP parser จะทำการหาชื่อตัวแปรที่เป็นไปได้ แล้วนำค่าของตัวแปรนั้นแทนที่ลงในข้อความ หรือจะครอบตัวแปรด้วย { } เพื่อเจาะจงชื่อตัวแปรก็ได้
<source lang="php">
<?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"; // ใช้งานได้
?>
</source>
ถ้าจะใช้กับ array หรือ object จะต้องมีการใช้งานที่ถูกต้อง
<source lang="php">
<?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.";
?>
</source>
====แบบซับซ้อน====
ที่เรียกว่าแบบซับซ้อน ไม่ใช่เพราะมันรูปแบบซับซ้อน แต่เพราะสามารถใช้งานได้ซับซ้อนกว่า<br/> <br/>
ในความจริงแล้วค่าทุกค่าใน namespace สามารถใช้งานใน ข้อความ ได้เหมือนอย่างที่ใช้งานนอกข้อความ โดยต้องครอบไว้ด้วย {$ }
<source lang="php">
<?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()}}";
?>
</source>
*ใน PHP5 ขึ้นไป Function และ Method สามารถใช้งานใน {$ } ได้
===การเข้าถึงและแก้ไข อักขระ ใน string===
มีรูปแบบการใช้งานคล้ายกับ array
<source lang="php">
<?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';

?>
</source>
*การเข้าถึงตัวแปรชนิดอื่นโดยใช้ [] หรือ {} ค่าที่ได้จะเป็น '''NULL'''
===การเชื่อมข้อความ===
การจะเชื่อมข้อความใส่กันนั้น อาจจะใช้ . (จุด, ดอท) operator เอา
<source lang="php">
<?php
$str = "is a";
echo "This " . $str . " book"; // Outputs: This is a book
?>
</source>
===การแปลงเป็น string===
การแปลงค่าเป็น string นั้นสามารถทำได้โดยใช้ (string) แปลงหรือใช้ strval() การแปลงค่าเป็น string จะเกิดขึ้นโดยอัตโนมัติเมื่อจำเป็นต้องใช้ อย่างที่เป็นใน echo() หรือ print() หรือเมื่อมีการนำค่าชนิดอื่นมาเทียบกับค่า string<br/><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/>
[[ภาษาพีเอชพี/คู่มืออ้างอิงภาษา/ประเภทของตัวแปร/Objects|Object]] จะถูกแปลงเป็น ข้อความ "Object" เสมอ<br/><br/>
[[ภาษาพีเอชพี/คู่มืออ้างอิงภาษา/ประเภทของตัวแปร/Resources|Resource]] จะถูกแปลงเป็น ข้อความ ในรูปแบบ "Resource id #1" โดย ''1'' คือ unique number ที่กำหนดให้ resource โดย PHP ตอนที่รัน<br/><br/>
'''NULL''' จะแปลงเป็น empty string เสมอ
===แปลง string เป็นเลข===
โดยปกติเมื่อมีการแปลง string เป็นเลข จะแปลงเป็น integer แต่ถ้าหากมี '.' , 'e' หรือ 'E' อยู่ในข้อความจะแปลงเป็น float<br/><br/>
ค่าที่จะได้นั้นขึ้นอยู่กับส่วนเริ่มต้นของ ข้อความ ถ้า ข้อความ ขึ้นต้นด้วย จำนวนที่ถูกต้อง ค่านั้นก็จะเป็น ค่าที่แปลงได้ นอกเหนือจากนั้นจะแปลงได้เป็น 0 (ศูนย์) รูปแบบค่า จำนวนที่ถูกต้อง ก็คืออาจจะขึ้นต้นด้วยเครื่องหมายบวกหรือลบ ตามด้วยตัวเลข(อาจจะมีจุดทศนิยม) แล้วตามด้วย เลขยกกำลัง โดยเลขยกกำลังนั้น คือ e หรือ E ตามด้วยตัวเลข
<source lang="php">
<?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)
?>
</source>
*ใช้ ord() และ chr() ในการแปลงไปกลับระหว่าง ASCII code กับ อักขระ

รุ่นแก้ไขเมื่อ 12:28, 13 พฤษภาคม 2552

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