开发者学堂课程【PHP 基础入门课程(上) :字符串类型】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/709/detail/12594
字符串类型
内容简介:
一、目标
二、示例
三、小结
一、目标
掌握字符串的不同定义方式,以及各个方式的区别
概念
字符串:字符串是由数字、字母和下划线组成的一串字符
字符串是编程中用到最多的数据格式,有多种定义方式:
•单引号包裹:使用英文单引号’’包裹字符
•双引号包裹:使用英文双引号””包裹字符
•定界符包裹:使用 PHP 中的定界符<<<标识符+标识符结尾形式包裹(多行字符串的一种形式)
• heredoc 结构:双引号的一种多行字符串形式
•nowdoc 结构:单引号的一种多行字符串形式
二、示例
#单引号字符串
Sstr1='hello world';
#双引号字符串
$str2="hello world";
#定界符:heredoc:注意 EOT 并非固定,自己取名即可(但不要与关键字同名)$str3 = <<<EOT
$str1
EOT;
#输出:hello world
#定界符:nowdoc
$str4 = <<<'EOT'
$str1
EOT;
#输出:$str1
案例示范:
首先用单引号定义内容
代码如下:
<?php
# 字符串类型
#单引号定义内容
$str1 = ‘hello world ’;
var_dump($str1);
浏览器搜索 localhost/11string.php 查看结果
结果显示:
string(11)“hello world”
11代表长度,空格此时也代表一个字符
再用双引号来定义内容,看二者有什么区别
代码如下:
#双引号定义内容
$str1 = “hello world”;
var_dump($str1,$str2);
打开浏览器刷新界面
结果如下:
string(11)“hello world”string(11)“hello world”
对比发现二者结果没有区别
举例查看 heredoc 结构
代码如下:
#定界符:heredoc结构
$str3 = <<<END
这里都是字符串
END;
var_dump($str1,$str2,$str3);
结果如下:
string(11)“hello world”string(11)“hello world”string(24) “这里都是字符串”
举例查看 nowdoc 结构
代码如下:
#定界符:nowdoc 结构
$str4 = <<<‘END’
这里也是字符串
END;
var_dump($str1,$str2,$str3,$str4);
结果如下:
string(11)“hello world”string(11)“hello world”string(24) “这里都是字符串”string(22) “这里也是字符串”
区别
1、单引号是最简单字符串
•里面能解析少量转义符:单引号(\’),反斜杠(\\)
代码示例如下:
$str1 = 'abcdefg\r\n\t\'\"\\$a';
echo $str1,‘<br/>’ ;
浏览器刷新查看结果
结果如下:
abcdefg\r\n\t'\"\$a
发现\' \\被转译
双引号示例代码如下:
$str1 = 'abcdefg\r\n\t\'\"\\$a';
$str = “abcdefg\r\n\t\'\"\\$a”;
echo $str1,‘<br/>’ ;
echo $str2,‘<br/>’ ;
浏览器刷新查看结果
结果如下:
Notice:Undefined variable:a in
D:\server\Apache24\htdocs\11string.php on line 27
abcdefg\r\n\t'\"\$a
abcdefg\'”\
其中报错反应了双引号里面如果有 PHP 变量,也可以被解析
此时需要在代码前定义
$a = ‘hello world’;
再次刷新浏览器发现结果如下:
abcdefg\r\n\t'\"\$a
abcdefg\'”\hello world
也可以添加转译
$str1 = 'abcdefg\r\n\t\'\"\\$a';
$str = “abcdefg\r\n\t\'\"\\\$a”;
刷新浏览器发现结果如下:
abcdefg\r\n\t'\"\$a
abcdefg\'”\$a
#单引号解析
$a = 100;
$str = 'abcdefg\r\n\t\'\"\\$a';
#输出:abcdefg\r\n\t'\"\$a #单引号被解析’,反斜杠被解析\,其他均不解析
2、双引号相对单引号功能较多
•里面能解释较多转义符:$符号(\$) 双引号(\”) 反斜杠(\\),回车换行符(\r\n),tap 符(\t)
•里面如果有 PHP 变量,也可以被解析
#双引号解析
$a = 100;
$str="abcdefg\r\n\t\'\"\\$a";
#输出:abcdefg \’”\100
入r\n转换成换行空格,单引号不解析\',双引号解析",反斜杠解析\,$a被解析100
3、定界符中 heredoc 与双引号效果一致,nowdoc 与单引号一致
•定界符会自动保留格式:即如果内部字符串有换行之类的会自动保留
代码如下:
$str1 = 'abcdefg\r\n\t\'\"\\$a';
$str = “abcdefg\r\n\t\'\"\\$a”;
$str3 = <<<END
$str1
这里都是字符串
END;
#定界符:nowdoc 结构
$str4 = <<<‘END’
$str1
这里也是字符串
END;
echo $str3,‘<br/>’ ;
echo $str4,‘<br/>’ ;
刷新浏览器结果如下:
abcdefg\r\n\t'\"\$a 这里都是字符串
$str1 这里也是字符串
结果说明 heredoc 与双引号效果一致,nowdoc 与单引号一致
双引号解析变量时,不能识别内容是否为变量,也不知道变量在内存中是否存在
注意
1、双引号解析变量时,系统是有规矩匹配变量的
•变量名不要与其他字母或者数字保留在一起:如 "abc”系统会自动识别 abc,而不是 $a
•解决方案1:让变量与后面的内容之间有空格,如"$a bc ”系统识别 $a (此时会额外多出一个空格)。
•解决方案2:使用{}将变量独立包裹,如"{$a}bc ”系统识别 $a (建议)
代码如下
$str3 = "$a bc ”
echo $str3,‘<br/>’ ;
结果为 hello world bc
$str4 = "{$a}bc ”
结果为 hello worldbc
所以通过比较可知第二种方法保留了原有的结构不会增加额外的内容
2、使用定界符定义多行字符串时有很多规矩
•定界符内的所有内容都是字符串的内容(包括注释)
$str3 = <<<END
#这里是字符串内部
END;
echo $str3,‘<br/>’ ;
结果为 #这里是字符串内部
•定界符的起始符号之后不能有任何信息,包括空格
$str3 = <<<END #空格
#这里是字符串内部
END;
echo $str3,‘<br/>’ ;
输出结果报错
删掉#空格后结果仍报错
将 $str3 = <<<END 后的空格删除后才能正常输出
#这里是字符串内部
•定界符的结束符号必须顶格
注意
1、双引号解析变量时,系统是有规矩匹配变量的
•变量名不要与其他字母或者数字保留在一起:如“$abc" 系统会自动识别 $abc,而不是 $a
•解决方案1:让变量与后面的内容之间有空格,如“$a bc" 系统识别 $a (此时会额外多出一个空格)
•解决方案2:使用)将变量独立包裹,如 "($a)bc" 系统识别 $a (建议)
2、使用定界符定义多行字符串时有很多规矩
•定界符内的所有内容都是字符串的内容(包括注释)
•定界符的结束符号必须顶格
•定界符的结束符号后同样不能有任何信息
#错误示范1:定界符起始符号后有内容
Sstr = <<<EOT #这是起始
hello world
EOT;
#错误示范2:定界符结束符号不顶格
Sstr = <<<EOT
hello world
EOT;
#错误示范3:定界符结束符号后有内容
$str = <<<EOT
hello world
EOT;
#字符串结束
三、小结
1、字符串是程序编码中应用最多的一种类型,可以使用多种方式定义
•单引号定义
•双引号定义
•定界符定义
•heredoc 定义:代替双引号
•nowdoc 定义:代替单引号
2、单引号与双引号有区别
•单引号解析的转义符号较少:\和\\
•双引号解析的转义符号较多:\"、\\、\r\n、\t、\s
•双引号中可以解析变量,但要注意变量的规则
•让变量名与其他可能让系统误解的符号分开
•给变量名增加一个{}
3、使用定界符的时候要注意定界符的严格要求工
•起始符号后不能有任何内容(包括空格)
•结束符号必须顶格
•结束符号后不能有任何内容