關於 PHP 的資料型別 (二)

周小帥發表於2018-09-25

php資料型別-字串
string (字串):
一個字串由一系列的字元組成,其中每個字元等同於一個位元組。這意味著PHP只能支援 256 的字符集,因此不支援 Unicode;

string 型別最大可以達到 2GB;

字串的三種表達方式:

  • 單引號
  • 雙引號
  • heredocnowdoc

單引號:定義一個字串的最簡單的方法是用單引號把他包圍起來(字元);

  • 單引號不能解析變數;
  • 單引號只能解析單引號和反斜線本身;
  • 變數與變數,變數與字串之間,字串與字串之間使用 . 來連線;

雙引號:定義一個字串也可以使用雙引號將它包圍起來(字元);

  • 雙引號可以解析變數,變數可以使用特殊字元和 {} 包含;
  • 雙引號可以解析所有的轉移字元;
  • 變數與變數,變數與字串之間,字串與字串之間使用 . 來連線;

效率:單引號的效率要高於雙引號;

雙引號裡的變數會經過編譯器解釋,然後在輸出,單引號直接輸出;

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;
?>

heredocnowdoc:
表達字串的方法是用 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 總是被轉變成 空字串
  • 直接把 arrayobject 或 resource 轉換成 string 不會得到除了其型別之外的任何有用資訊。可以使用函式 print_r() 和 var_dump() 列出這些型別的內容。
  • 大部分的 PHP 值可以轉變成 string 來永久儲存,這被稱作序列化,可以用函式 serialize() 來實現。如果 PHP 引擎設定支援 WDDX,PHP 值也可被序列化為格式良好的 XML 文字。

Monkey

相關文章