PHP 字符串浅析

一、定义

String 字符串 : 一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节,需要书写在定界符中。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode 。

二、语法

一个字符串可以用 4 种方式表达:

  1. 单引号
  2. 双引号
  3. heredoc 语法结构
  4. nowdoc 语法结构(自 PHP 5.3.0 起)

单引号

定义一个字符串的最简单的方法是用单引号把它包围起来 ‘字符’。

$Username = 'Stussy';
echo 'Stussy';      // Stussy
echo '$Username';      // $Username 不解析变量

若字符串中出现与定界符相同的字符,需用\进行转义,常用转义符见下表
(*注意:\和\’在单引号中依然解析)

echo 'Stussy's computer';   //Parse Error
echo 'Stussy\'s computer';   //Stussy's computer 
echo 'Stussy says "Hello!"';  //Stussy says "Hello!"

要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。要表达一个反斜线自身,则用两个反斜线(\)。其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想使用其它转义序列例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身。

如果字符串中无需解析,使用’ ‘将提高效率

双引号

如果字符串是包围在双引号 “” 中, PHP 将对一些特殊的字符进行解析:

序列含义
\n换行(ASCII 字符集中的 LF 或 0x0A (10))
\r回车(ASCII 字符集中的 CR 或 0x0D (13))
\t水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
\eEscape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
\f换页(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
\反斜线
\$美元标记
\”双引号
\[0-7]{1,3}符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9A-Fa-f]{1,2}符合该正则表达式序列的是一个以十六进制方式来表达的字符


$Username = 'Stussy';
echo "Stussy";          // Stussy  
echo "$Username";      // Stussy  解析变量

若字符串中出现与定界符相同的字符,需用\进行转义

echo "Stussy says "Hello!"";    //Error
echo "Stussy says \"Hello!\"";   //Stussy says "Hello!"
echo "$Username says \"Hello!\"";   //Stussy says "Hello!"

heredoc结构(相当于双引号“”)

第三种表达字符串的方法是用 heredoc 句法结构:<<<。在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。
(注:标识名称只能包含字母、数字、下划线,并且必须以字母和下划线开始,结束符前不能有任何内容)

<<< 标识名称
    内容
    标识名称;

结束时所引用的标识符必须在该行的第一列,而且,标识符的命名也要像其它标签一样遵守 PHP 的规则:只能包含字母、数字和下划线,并且必须以字母和下划线作为开头。

//heredoc用法
$username = 'Disel';
$desc = '"Very Good!"';

$table = <<<EOF        //php5.3之后 可使用双引号来声明标识符
<table border='1px solid black'>
    <tr>
        <td>编号</td>
        <td>用户名</td>
        <td>描述</td>
    </tr>
    <tr>
        <td>1</td>
        <td>Stussy</td>
        <td>"Hello World!"</td>
    </tr>
    <tr>
        <td>2</td>
        <td>{$username}</td>
        <td>{$desc}</td>
    </tr>
</table>

EOF;

echo $table;   

得到用户表:

编号用户名描述
1Stussy“Hello World!”
2Disel“Very Good!”


Nowdoc 结构 (相当于单引号‘’)

就象 heredoc 结构类似于双引号字符串,Nowdoc 结构是类似于单引号字符串的。Nowdoc 结构很象 heredoc 结构,但是 nowdoc 中不进行解析操作。这种结构很适合用于嵌入 PHP 代码或其它大段文本而无需对其中的特殊字符进行转义。

一个 nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<’EOT’。Heredoc 结构的所有规则也同样适用于 nowdoc 结构,尤其是结束标识符的规则。

//nowdoc用法
$username = 'Disel';
$str=<<<'EOD'
    hello Stussy<br/>
    {$username}
EOD;

得到:

hello Stussy
{$username}

变量解析

当 PHP 解析器遇到一个美元符号($)时,它会和其它很多解析器一样,去组合尽量多的标识以形成一个合法的变量名。可以用花括号来明确变量名的界线。

$Username = 'Stussy';
echo "My name is $Username ";  //My name is Stussy
echo 'My name is $Username'; 	//My name is $Username
echo "My name is $Username1";  //Error
echo "My name is $Username 1";  //My name is Stussy 1
echo "My name is {$Username}1"; //My name is Stussy1

*注: { }内之间不要留空格{ $Username}、{$Username }或{ $Username }

任何具有 string 表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地像在 string 以外的地方那样写出表达式,然后用花括号 { 和 } 把它括起来即可。由于 { 无法被转义,只有 $ 紧挨着 { 时才会被识别。可以用 {\来表达 {

通过{ }操作字符串的内容,下标从0开始

$str = 'abcdefg';
echo $str{0};      // a
//替换
$str{2} = 'z';     //只能一个字符修改一个字符'c'=>'z'
echo $str;         // abzdefg
$str{2} = 'zoo';
echo $str;        // abzdefg
$str = '你好';      //中文在utf-8中占3个字节
//删除
$str = 'abcdef' ;
$str{2} = '';      //使用''替换'c'
echo $str;        //abdef
var_dump($str);    //string(6)"abdef" 长度不变 'c'变为''空字符串
//增加
$str = 'abc';
$str{3} = 'd';
echo $str;  	   //abcd 添加'd'到$str
$str = 'abc';
$str{6} ='d';
echo $str;        //abc d 源代码中:abc   d

//随机数
$str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$num='1234567890';
echo $str{mt_rand(0,strlen($str)-1)};   //$str中随机一个字符
echo $str{mt_rand(0,strlen($str)-1)}.$num{mt_rand(0,strlen($num)-1)}.$str{mt_rand(0,strlen($str)-1)}.$num{mt_rand(0,strlen($num)-1)};      //随机生成A1A1类型的字符串验证码;

三、数据类型转换成字符串

一个值可以通过在其前面加上 (string) 或用 strval() 函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。类型和类型转换可以更好的解释下面的事情,也可参考函数 settype()。

1. 自动转换

integer/float => string

echo 123;                       //123
echo 3.1415926;                 //3.1415926

boolean => string

echo TRUE;                      //1
echo FALSE;                     //空字符串
echo null;                      //空字符串

array => string

$arr = array(1,2,3);
echo $arr;                     //数组 array 总是转换成字符串 "Array"

resource => string

$handle = fopen('1.php', 'r');
echo $handle;                  //Resource id #3

object => string

$obj = new Class;
echo $obj;                     //error could not be converted to string

2. 临时转换

(string)$var

$var = 123;
$res = (string)$var;
var_dump($res);                    //string(3) "123"

其他类型结果同自动转换

strval()

$var = 123;
$res = strval($var);
var_dump($res);                    //string(3) "123"

其他类型结果同自动转换

3. 永久转换

settype($var,type);                //设置数据类型
gettype($var);                     //得到数据类型

举例:

$var = 123;
settype($var,'string');
var_dump($var);                    //string(3) "123"

四、字符串转换成其他数据类型

string => integer/float

如果该字符串没有包含 ‘.’,’e’ 或 ‘E’ 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。

该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 ‘e’ 或 ‘E’ 后面跟着一个或多个数字构成。

$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)     

string => boolean

空字符串、”0”、’0’ -> false
补充:boolean false
- 布尔值 FALSE 本身
- 整型值 0(零)
- 浮点型值 0.0(零)
- 空字符串,以及字符串 “0”
- 不包括任何元素的数组
- 特殊类型 NULL(包括尚未赋值的变量)
- 从空标记生成的 SimpleXML 对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值