string
(字串):一個字串由一系列的字元組成,其中每個字元等同於一個位元組。這意味著PHP只能支援 256 的字符集,因此不支援 Unicode
;
string
型別最大可以達到2GB
;字串的三種表達方式:
單引號
雙引號
heredoc
和nowdoc
① 單引號:定義一個字串的最簡單的方法是用單引號把他包圍起來(字元
);
- 單引號不能解析變數;
- 單引號只能解析單引號和反斜線本身;
- 變數與變數,變數與字串之間,字串與字串之間使用
.
來連線;
② 雙引號:定義一個字串也可以使用雙引號將它包圍起來(字元
);
- 雙引號可以解析變數,變數可以使用特殊字元和
{}
包含;- 雙引號可以解析所有的轉移字元;
- 變數與變數,變數與字串之間,字串與字串之間使用
.
來連線;
效率:單引號的效率要高於雙引號;
雙引號裡的變數會經過編譯器解釋,然後在輸出,單引號直接輸出;
example1.php
//單引號例項
<?php
echo 'this is a simple string';
// 可以錄入多行
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';
// 輸出: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';
// 輸出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';
// 輸出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';
// 輸出: This will not expand: \n a newline
echo 'This will not expand: \n a newline';
// 輸出: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>
example2.php
<?php
//雙引號例項
$a = 123;
$str = "abcd{$a}efg"; //雙引號可以解析變數,使用 {} 將變數括起來。 {} 不會輸出;
$str1 = 'abcd@$a@efg'; //可以使用特殊字元將變數括起來,但是特殊字元會輸出 abcd@123@efg
$str2 = "abcd'$a'efg"; // 雙引號中有單引號,此種情況變數可以被解析,同時單引號也會輸出 abcd'123'efg;
?>
③ heredoc
和 nowdoc
:表達字串的方法是用 heredoc 句法結構:<<< 在該運算子之後要提供一個識別符號,然後換行。 接下來是字串本身,最後要用前面定義的識別符號作為結束標誌。 結束時所引用的識別符號 必須 在該行的第一列,而且,識別符號的命名也要像其它標籤一樣遵守 PHP 的規則:只能包含字母、數字和下劃線,並且必須以字母和下劃線作為開頭;
注意:要注意的是結束識別符號這行除了可能有一個分號(;)外,絕對不能包含其它字元;
heredoc
類似於雙引號
,字串中可以
解析變數,但是不可以
轉移字元;(就像沒有使用雙引號""
的雙引號字串)
example3.php
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
/* 含有變數的更復雜示例 */
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;
?>
以上會輸出:
My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A
- 可以把
heredoc
結構用在函式引數中來傳遞資料:<?php var_dump(array(<<<EOD foobar! EOD )); ?>
- 可以用
heredoc
結構來初始化靜態變數和類屬性和常量:
<?php
// 靜態變數
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// 類的常量、屬性
class foo
{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
- 可以在
heredoc
結構中使用雙引號來宣告識別符號:<?php echo <<<"FOOBAR" Hello World! FOOBAR; ?>
Nowdoc
結構:Nowdoc 結構是類似於單引號字串的。但是 nowdoc 中不進行解析操作;這種結構很適合用於嵌入 PHP 程式碼或其它大段文字而無需對其中的特殊字元進行轉義;一個 nowdoc 結構也用和 heredocs 結構一樣的標記 <<<, 但是跟在後面的識別符號要用單引號括起來,即 <<<'EOT'。
example4.php
<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
/* 含有變數的更復雜的示例 */
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;
?>
以上會輸出:
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
-
nowdoc 結構可以用在任意的靜態資料環境中,最典型的示例是用來初始化類的屬性或常量;
<?php class foo { public $bar = <<<'EOT' bar EOT; } ?>
-
變數解析:
當字串用
雙引號
或heredoc
結構定義時,其中的變數將會被解析。 - 存取和修改字串中的字元:
string 中的字元可以通過一個從
0
開始的下標,用類似 array 結構中的方括號包含對應的數字來訪問和修改,比如$str[42]
。可以把 string 當成字元組成的 array;也可用花括號
訪問,比如$str{42}
注意:
- 用
超出
字串長度的下標寫入將會拉長該字串
並以空格
填充。 非整數
型別下標會被轉換成整數
。非法下標
型別會產生一個E_NOTICE
級別錯誤。- 用
負數下標
寫入字串時會產生一個E_NOTICE
級別錯誤,用負數下標讀取
字串時返回空字串
。 寫入
時只用到了賦值字串的第一個
字元。- 用
空字串賦值
則賦給的值是NULL
字元。 字串 在內部是位元組組成的陣列。
因此用花括號訪問或修改字串對多位元組字符集很不安全
。僅應對單位元組編碼例如 ISO-8859-1 的字串進行此類操作。
example5.php
<?php
// 取得字串的第一個字元
$str = 'This is a test.';
$first = $str[0];
// 取得字串的第三個字元
$third = $str[2];
// 取得字串的最後一個字元
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// 修改字串的最後一個字元
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
字串下標
必須為整數
或可轉換為整數的字串
,否則會發出警告
。之前類似"foo"
的下標會無聲地轉換成0
。
轉換成字串:
一個值可以通過在其前面加上
(string)
或者使用strval()
函式來轉變成字串;
- 一個布林值 boolean 的
TRUE
被轉換成 string 的"1"
。Boolean 的FALSE
被轉換成""
(空字串)。這種轉換可以在 boolean 和 string 之間相互進行。- 一個整數 integer 或浮點數 float 被轉換為數字的字面樣式的 string(包括 float 中的指數部分)。使用指數計數法的浮點數(
4.1E+6
)也可轉換。- 陣列 array 總是轉換成字串
"Array"
,因此,echo 和 print 無法顯示出該陣列的內容。要顯示某個單元,可以用echo $arr['foo']
這種結構。- 物件 object 總是被轉換成字串
"Object"
- 資源 resource 總會被轉變成
"Resource id #1"
這種結構的字串,其中的 1 是 PHP 在執行時分配給該 resource 的唯一值。NULL
總是被轉變成空字串
。- 直接把 array,object 或 resource 轉換成 string 不會得到除了其型別之外的任何有用資訊。可以使用函式 print_r() 和 var_dump() 列出這些型別的內容。
- 大部分的 PHP 值可以轉變成 string 來永久儲存,這被稱作序列化,可以用函式 serialize() 來實現。如果 PHP 引擎設定支援 WDDX,PHP 值也可被序列化為格式良好的
XML
文字。