PHP第二节数据类型之字符串类型
PHP中一个字符串可以通过下面的4种方式来定义:
单引号
双引号
heredoc语法结构
nowdoc语法结构(自PHP5.3.0以后)
单引号
定义一个字符串的最简单的方法是用单引号把它包围起来(标点符号')。
如果想要输出一个单引号,需在它的前面加个反斜线(\)。在单引号前或在字符串的结尾处想要输出反斜线,输入两条(\\)。注意,如果在任何其它的字符前加了反斜线,反斜线将会被直接输出。
Note:不像双引号和heredoc语法结构,在单引号字符串中的变量和特殊含义的字符将不会被替换。
如果字符串是包围在双引号(")中,PHP将对一些转义字符进行解析,和单引号字符串一样,如果输出转义字符之外的字符,反斜线会被打印出来。PHP5.1.1以前,\{$var}中的反斜线还不会被显示出来。
用双引号定义的字符串最重要的特征是变量会被执行。
Heredoc结构
第三种定义字符串的方法是用heredoc句法结构:<<<。在该提示符后面,要定义个标识符,然后是一个新行。接下来是字符串本身,最后要用前面定义的标识符作为结束标志。
结束时所引用的标识符必须在一行的开始位置,而且,标识符的命名也要像其它标签一样遵守PHP的规则:只能包含字母、数字和下划线,并且不能用数字和下划线作为开头。
Warning要注意的是结束标识符这行除了可能有一个分号(;)外,绝对不能包括其它字符。这意味着标识符不能缩进,分号的前后也不能有任何空白或tabs。更重要的是结束标识符的前面必须是个被本地操作系统认可的新行标签,比如在UNIX和MacOSX系统中是\n,而结束标识符(可能有个分号)的后面也必须跟个新行标签。
如果不遵守该规则导致结束标签不“干净”,PHP将认为它不是结束标识符而继续寻找。如果在文件结束前也没有找到一个正确的结束标识符,PHP将会在最后一行产生一个句法错误。
Heredoc结构就象是没有使用双引号的双引号字符串,这就是说在heredoc结构中引号不用被替换,但是上文中列出的字符(\n等)也可使用。变量将被替换,但在heredoc结构中字符串表达复杂变量时,要格外小心。
Nowdoc结构
就象heredoc结构类似于双引号字符串,Nowdoc结构是类似于单引号字符串的。Nowdoc结构很象heredoc结构,但是nowdoc不进行解析操作。这种结构很适合用在不需要进行转义的PHP代码和其它大段文本。与SGML的<![CDATA[]]>结构是用来声明大段的不用解析的文本类似,nowdoc结构也有相同的特征。
一个nowdoc结构也用和heredocs结构一样的标记<<<,但是跟在后面的标志符要用单引号括起来,就像<<<'EOT'这样。heredocs结构的所有规则也同样适用于nowdoc结构,尤其是结束标志符的规则。
变量解析
当字符串用双引号或heredoc结构定义时,其中的变量将会被解析。
这里共有两种语法规则:一种简单规则,一种复杂规则。简单的句法规则是最常用和最方便的,它可以用最少的代码在一个字符串中加入变量,数组值,或对象属性。
复杂的句法规则是在PHP4以后加入的,被花括号包围的表达式是其明显标记。
简单句法规则
当PHP解析器遇到一个美元符号($),它会和其它很多解析器一样,去尽量形成一个合法的变量名。可以用花括号来明确变量名的界线。
如果想要表达更复杂的结构,请用复杂句法规则。
复杂句法规则
复杂句法规则不是结构复杂而命名,而是因为它可以使用复杂的表达式。
任何想用在字符串中标量变量,数组变量或对象属性都可使用这种方法。只需简单地像在字符串以外的地方那样写出表达式,然后用花括号{和}把它括起来。由于{无法被转义,只有$要紧挨着{才会被认出来,可以用{\$来表达{$。
存取和修改字符串中的字符
字符串中的字符可以通过一个以0为开始的,用类似数组结构中的方括号包含对应的数字来查找和修改,比如$str[42],可以把字符串想像数组。函数substr()和substr_replace()可以用来实现多于一个字符的情况。
Warning方括号中的数字超出范围将会产生空白。非整数类型被转换成整数,非整数类型转变成整数,非法类型会产生一个E_NOTICE级别错误,负数在写入时会产生一个E_NOTICE,但读取的是空字符串。被指定的字符串只有第一个字符可用,空字符串用指定为空字节。
有用的函数和操作符
字符串可以用'.'(点)操作符连接起来,注意'+'(加号)操作符没有这个功能。
对于字符串的操作有很多有用的函数。
可以参考字符串函数了解大部分函数,高级的查找&替换功能可以参考正则表达式函数或Perl类型的正则表达式函数。
另外还有URL字符串的函数,也有加密/解密字符串的函数。(mcrypt和mhash).
最后,可以参考字符类型函数。
转换成字符串
一个值可以通过在其前面加上(string)或用strval()函数来转变成字符串。在一个需要字符串的表达式中,字符串会自动转变,比如在使用函数echo或print时,或在一个变量和一个字符串进行比较时,就会发生这种转变类型和类型转换可以更好的解释下面的事情,也可参考函数settype()。
一个booleanTRUE值被转换成字符串"1"。BooleanFALSE被转换成""(空的字符串)。这种转变可以在boolean和字符串之间往返进行。
一个整数或浮点数被转变为数字的字面样式的字符串(包括浮点数中的指数部分),使用指数计数法的浮点数(4.1E+6)也可转变。
数组转换成字符串"Array",因此,echo和printc无法显示出该数组的值。如果显示一个数组值,可以用echo$arr['foo']这种结构,更多内容见下文。
在PHP4中对象被转换成字符串"Object",为了调试原因需要打印出对象的值,方法见正文。为了得到对象的类的名称,可以用get_class()函数。在PHP5中,可以用__toString。
资源总会被转变成"Resourceid#1"这种结构的字符串,其中的1是PHP分配给该资源的独特数字。不用过多关注这种结构,它马上要转变了。为了得到一个resource类型,可以用函数get_resource_type()。
NULL总是被转变成空的字符串。
如上面所说的,直接把数组,对象或资源转换成字符串不会得到超出其自身的更多信息。可以使用函数print_r()和var_dump()列出这些类型的内容。
大部分的PHP值可以转变成字符串s来长期储存,这被称作串行化,可以用函数serialize()来实现。如果PHP引擎设定支持WDDX,PHP值也可储存成XML格式。
字符串转变成数字
当一个字符串被用在了一个数字的环境中,结果和类型如下:
如果字符串没有包含'.','e'或'E'并且数字值符合整数类型的限定(PHP_INT_MAX定义的),这个字符串可被认定是一个integer,在其它情况下被认定为一个float。
字符串的开始部分给定了它的值,如果字符串以合法的数字开始,这个数字可直接使用。否则,值就是0(零)。合法数值由符号,后面跟着一个或多个数字(可能有个小数点),再跟着可选的指数符号如'e'或'E',后面跟着一个或多个数字。
不要想像在C语言中的那样,通过一个整数转换得到相应字符,使用函数ord()和chr()实现ASCII码和字符间的转换。
更多信息请查看IT技术专栏