1.4 String 字符串

基本介紹

字符串 string 由一系列的字符組成,每個字符等于一個字節。
PHP中的字符串只支持256的字符集,因此不支持Unicode
一個字符串最大可以達到2GB
多個字符串通過小數點.拼接,而不是加號+
字符串并無特定的編碼,而是根據腳本文件的編碼方式來編碼。

語法介紹

字符串支持四種語法,分別是單引號、雙引號、heredocnowdoc

  • 單引號

    echo '輸出單引號:\',需要使用斜杠。';
    echo '輸出斜杠:\\,也需要使用斜杠。';
    echo '無法輸出轉義字符,如\r,如\n等會被原樣輸出。';
    echo '無法輸出變量,如$varname。';
    
  • 雙引號

    echo "輸出雙引號和斜杠的方法和上例一樣:\"和\\";
    echo "可以輸出一些轉義字符,如\t制表符";
    echo "可以輸出變量,如$varname";
    
  • Heredoc
    語法上由 <<< 三個小于號加一個開始標識符和一個結束標識符組成,這兩個標識符必須相同,且結束標識符必須獨占一行,首尾不能有其他內容。
    功能上如同雙引號一樣,能在里面解析變量,但格式非常令人蛋疼。

    <?php
    $string = <<<TOKEN
    <h1>你好啊,我是劉德華。</h1>
    TOKEN;
    
    class Example{
      public $foo;
      public $bar;
      function __construct($f, $b){
          $this->foo = $f;
          $this->bar = $b;
      }
    }
    
    $exam = new Example('iGuoji', ['abc', 'xyz', '123']);
    echo <<<TOKEN
    自我介紹:
    $string
    <p>我的英文名叫做:$exam->foo</p>
    <p>我有一個數組:{$exam->bar[0]}</p>
    TOKEN;
    
    # 記住,結束標識符還不能是最后一行
    
  • Nowdoc
    語法上和Heredoc一樣,區別只是開始標識符必須用單引號包裹,而且其內容和單引號的字符串一樣,內容不會被解析。

變量解析

在雙引號和Heredoc的語法結構中可以使用變量、對象等內容,因此在一些復雜的輸出中會常常用到大括號{}(界定符),一組界定符代表一個表達式,如該界定符外有$符號,則該表達式將返回一個變量名,詳情參考 可變變量

  • 普通變量
    $name = "iGuoji";
    echo "
      <p> 第一種:$name </p>
      <p> 第二種:{$name} ,我用到了界定符</p>
      <p> 第三種:${name} ,先返回字符串'name',然后$和`name`拼接 </p>
      <p> 第四種:{${name}} </p>
    ";
    
  • 普通數組
    $array = ['Laravel', 'Yii', 'ThinkPHP'];
    echo "
      <p> 第一種:$array[0] </p>
      <p> 第二種:{$array[1]} </p>
      <p> 第三種:${array[2]} </p>
      <p> 第三種情況是界定符中先返回字符串'array[2]',然后再和$拼接 </p>
    ";
    
  • 普通函數(更容易理解界定符和可變參數)
    $name = "iGuoji";
    function hello(){
      return "name";
    }
    echo <<<TOKEN
      <p> 第一種:${hello()} </p>
      <p> 第二種:{${hello()}} </p>
    TOKEN;
    
  • 對象屬性
    $guoji = 'Hello World';
    class Example{
      public static $foobar = "guoji";
      public $foo;
      public $bar;
      public function __construct(string $f,  array $b = []){
          $this->foo = $f;
          $this->bar = $b;
      }
      public function say(){
          return static::$foobar;
      }
    }
    $exam = new Example('Laravel', ['Yii', 'Ci', 'Yar']);
    echo <<<TOKEN
      <p> 對象屬性:$exam->foo : {$exam->foo} </p>
      <p> 對象數組:{$exam->bar[0]} </p>
      <p> 對象函數:{$exam->say()} </p>
      <p> 靜態屬性:${Example::$foobar} </p>
    TOKEN;
    

注意:
函數、方法、靜態類變量、類常量只有在PHP的新版本里才可以在{$}中使用,而且得到的也將只是一個變量名,參考上例中 ${Example::$foobar} 語句。

修改存取

字符串的修改讀取可以直接使用=賦值運算符,也可以如數組一樣使用索引操作,其原因是字符串本質上是一個由字節組成的數組。

  • 讀取操作

    // 定義字符串
    $string = 'Laravel';
    
    // 正確的方法
    echo '完整字符串:' . $string  . '<br/>';
    echo '整體長度:' . strlen($string) . '<br/>';
    echo '第一個字符:' . $string[0] . '<br/>';
    echo '第二個字符:' . $string{1} . '<br/>';
    echo '第三個字符:' . $string['2'] . '<br/>';
    echo '最后一個字符:' . $string[-1] . '<br/>';
    echo '倒數第二個字符:' . $string[-2] . '<br/>';
    
    // 對于不存在的索引,PHP將發出Notice通知
    echo '第N個字符:' . $string[10] . '<br/>';
    
    // 對于錯誤的索引,PHP將發布Warning警告
    echo '錯誤的索引:' . $string['abc'] . '<br/>';
    echo '錯誤的索引:' . $string[true] . '<br/>';
    
  • 修改操作

    // 定義字符串
    $string = 'Laravel';
    echo '完整字符串:' . $string  . '<br/>';
    
    // 修改第一個字符
    $string[0] = 'F';
    echo $string . '<br />';
    
    // 換一種方式修改
    $string{0} = 'G';
    echo $string . '<br />';
    
    // 修改成多個字符
    $string{0} = 'Hello';
    echo $string . '<br />';
    
    // 修改最后一個字符
    $string[-1] = 's';
    echo $string . '<br />';
    
    // 看看長度
    echo '長度:' . strlen($string) . '<br />';
    
    // 修改不存在的索引,將會拉長字符串長度,并以空格填充空位
    $string[10] = '!';
    echo $string . '<br />';
    
    // 看看長度
    echo '長度:' . strlen($string) . '<br />';
    
    

類型轉換

可以在變量的前面加上(string)或用strval()函數來轉成字符串。

  • 布爾值會將TRUE轉成字符串'1'FALSE轉成''空字符串
  • 整數型或浮點型會被轉成字符串形式的數值
  • 數組總是轉換成字符串'Array'
  • 對象通常會轉換成字符串'Object',通過toString()方法更改
  • 資源類總會被轉成'Resource id #1'這種結構的字符串
  • NULL總是被轉成''空字符串
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容