PHP字符串你不知道的事
PHP常见的定义字符串的方式有那些?
1、单引号
在单引号中,任何特殊字符都会按原样输出【除\、\‘将会被转义输出】,不是什么都不解析的,这是很多人的误解
echo 'this is a var!'.PHP_EOL; //this is a var!
echo '6666$var666\n \t \b \\ \' \$'; //6666$var666\n \t \b \ ' \$2、双引号
遇到$将会解析该变量,双引号中会转义反斜杠的转义字符;
从理论上来讲单引号因为不需要解析$符号修饰的变量会快点
3、heredoc(语法糖)
$name = 'lis2';
$str = <<<"EOF"
$name\n
真帅
substr("aaaa",0,1);
if($name=='lis'){
echo 'true';
}else {
echo 'false';
}
EOF;
echo $str; //里面的函数和判断都不会解析,变量会解析,相当于用双引号把内容括起来
4、nowdoc(语法糖)
$name = 'lis2';
$str = <<<"EOF"
$name\n
真帅
substr("aaaa",0,1);
if($name=='lis'){
echo 'true';
}else {
echo 'false';
}
EOF;
echo $str;//相当于用单引号把内容括起来
字符串和其他类型的转换
echo null.PHP_EOL; //空字符串
echo false.PHP_EOL; //空字符串
echo true.PHP_EOL; //1
echo 222; //222
echo 333.0; //333
字符串的获取
$str = 'hello the beautiful world';
echo $str[6] . "\n"; //t
echo $str{6} . "\n"; //t
echo $str[-1]; //d 最后一个,数组是不能通过-1这种方法获取
变量的底层原理
每一个php变量都会由
变量类型
、value值
、引用计数次数
和`是否是引用变量的zval结构体组成struct _zval_struct {
union {
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
} value; //变量value值
zend_uint refcount__gc; //引用计数内存中使用次数,为0删除该变量
zend_uchar type; //变量类型
zend_uchar is_ref__gc; //区分是否是引用变量,是引用为1,否则为0
};
//PHP7
好文推荐:
字符串的最大长度
自PHP 7.0.0起,对64位版本中的字符串长度没有特殊限制。在32位版本和较早版本中,字符串最大可以为2GB(最大2147483647字节)
字符串是安装什么字符编码的?
答案是字符串会被按照该脚本文件相同的编码方式来编码。因此如果一个脚本的编码是 ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1,以此类推。不过这并不适用于激活了 Zend Multibyte 时;此时脚本可以是以任何方式编码的(明确指定或被自动检测)然后被转换为某种内部编码,然后字符串将被用此方式编码。
为什么说PHP不支持Unicode编码?
官方文档原文:一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode
PHP 中的 string 的实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。也就是byte[]数组组成的
$str = "李四";
echo strlen($str);//6
上面的代码如果是在utf-8编码格式下得出的结果,首先“李四”有两个字符“李”、“四”组成的,utf-8编码就是相当于一个表,全世界的每个符号(字符)都有一个值,经查的字符“李”对应的编码是E69D8E(一个数值,16进制的形式,十进制是15113614),“四”对应的编码是E59B9B,我们知道一个byte表示的单位是0-255,PHP如果想表示李这个字符,在utf-8编码格式下就要表示出15113614这个数就可以了,两个byte的最大长度的216=65536,224=16777216,所以三个byte可以表示“李”这个字符,同理字符“四”也是占用了三个byte,strlen是单字节函数,也就是计算的是占用字节byte数组的长度,划分的粒度是字节,所以也就是6了,同理如果是在gbk编码格式下得到的结果会是4。
如果想要正常的计算,需要使用mbstring扩展,multi-byte(多字节)的缩写
$str = '李四';
echo mb_strlen($str);
这个时候在看官方文档原文就可以这样理解:字符串要是0-255之间的字符我们可以看做每个字符一个字节,unicode超过了这个,所以不支持。
字符串类型的此特性解释了为什么 PHP 中没有单独的“byte”类型 - 已经用字符串来代替了。返回非文本值的函数 - 例如从网络套接字读取的任意数据 - 仍会返回字符串。
由于 PHP 并不特别指明字符串的编码,那字符串到底是怎样编码的呢?例如字符串
"á"
到底是等于"\xE1"
(ISO-8859-1),"\xC3\xA1"
(UTF-8,C form),"\x61\xCC\x81"
(UTF-8,D form)还是任何其它可能的表达呢?答案是字符串会被按照该脚本文件相同的编码方式来编码。因此如果一个脚本的编码是 ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1,以此类推。不过这并不适用于激活了 Zend Multibyte 时;此时脚本可以是以任何方式编码的(明确指定或被自动检测)然后被转换为某种内部编码,然后字符串将被用此方式编码。注意脚本的编码有一些约束(如果激活了 Zend Multibyte 则是其内部编码)- 这意味着此编码应该是 ASCII 的兼容超集,例如 UTF-8 或 ISO-8859-1。不过要注意,依赖状态的编码其中相同的字节值可以用于首字母和非首字母而转换状态,这可能会造成问题。字符串的二进制安全是什么意思?
C语言中的字符串的结束标志是‘\0’,这个是时候是二进制不安全的,PHP字符串中包含‘\0’的时候不会认为是字符串结束
更好的解释见:
PHP字符串你不知道的事的更多相关文章
- setTimeout,setInterval你不知道的事
javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...
- JavaScript 你不知道的事 -- 关于函数
接上篇Javascript 你不知道的事,直接条列了: 每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto__ ...
- 子字符串查找之————关于KMP算法你不知道的事
写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法 ...
- Javascript中那些你不知道的事之-- false、0、null、undefined和空字符串
话不多说直接进入主题:(如果有写的不对的地方欢迎指正) 我们先来看看他们的类型分别是什么: typeof类型检测结果 结论:false是布尔类型对象,0是数字类型对象,null是object对象,un ...
- string.Format之你不知道的事
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- 数据存储(一)--SharedPreferences之你不知道的事
一.SharedPreferences将数据文件保存在指定路径上 SharedPreferences原则上是仅仅能保存在当前应用程序私有的shared_prefs文件夹中,只是也不是绝对的,我们能够用 ...
- JS中字符串那些事~
1:字符串 JS中的任何数据类型都可以当作对象来看.所以string既是基本数据类型,又是对象. 2:声明字符串 var sStr = ‘字符串’;(常用) var oStr = new String ...
- VI 你不知道的事
1G 顶部 G 底部 ctrl+F 前进 ctrl+B 后退 /text 向前搜索 ?text 向后搜索 I i 插入字符串 a 光标后插入字符 A 跳到句末尾 wq 写入并退出 h k j l ...
- Javascript 你不知道的事,好吧,是我不知道的事
NaN表示一个不能产生正常结果的运算结果.它不等于任何值,包括它自己.可以用isNaN(number)来检测. 同Java中的字符串一样,JS中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...
随机推荐
- Qt QPainter画个球啊
Qt QPainter画个球啊 目录 Qt QPainter画个球啊 看效果 方法 代码 看效果 方法 使用绘图事件,绘制一个图形 使用定时事件,不停更新图形位置 代码 .h #pragma once ...
- ABBYY FineReader 14扫描和保存文档
在ABBYY FineReader 14中您可以使用扫描"新建任务"窗口选项卡上的内置任务创建各种格式的数字文档.本文介绍使用FineReader 14扫描和保存文档的方法. 1. ...
- FL Studio 插件使用技巧——Fruity Reeverb 2 (上)
许多学习FL的用户会发现,自己在听大师的电子音乐作品时都能感受到他们的音乐有一股强大的空间感,有时还能感知到深邃的意境.不少人会因此而疑惑:为什么出自我们之手的音乐就没有这样的效果呢?我们的音乐里到底 ...
- 如何基于App SDK快速地开发一个IoT App?
一.背景及大纲介绍 在如今物联网DCM(Device.Connect.Manage)的大框架下,有一个应用层来分析和处理数据,是必备技能.但是,对于一个公司来说,因为研发能力或者研发时间的原因,可能很 ...
- 学习关注:学习C++的前景
许多朋友都有这样的疑问,学习C/++能做什么?有什么好处?薪资怎么样,下面就为大家来解答! 像前面的文章有提到过,计算机专业位列热门专业第一门,可想前景如何.C语言C++属于高级语言,适合人类编写,现 ...
- limit+orderBy陷阱
碰到一个奇怪的bug,在排序的时候对一个非唯一的字段做order by, 结果在分页的时候,发现每一页的数据都是乱的,并不是对整个排序之后再去limit的. 当我们用唯一字段去排序的时候,因为在找到满 ...
- WireShark抓包分析以及对TCP/IP三次握手与四次挥手的分析
WireShark抓包分析TCP/IP三次握手与四次挥手 Wireshark介绍: Wireshark(前称Ethereal)是一个网络封包分析软件.功能十分强大,是一个可以在多个操作系统平台上的开源 ...
- c++11-17 模板核心知识(十二)—— 模板的模板参数 Template Template Parameters
概念 举例 模板的模板参数的参数匹配 Template Template Argument Matching 解决办法一 解决办法二 概念 一个模板的参数是模板类型. 举例 在c++11-17 模板核 ...
- SQL Server 索引碎片整理
索引碎片整理的四种方法: 1)删除索引并重建 2)使用 DROP_EXISTING 语句重建索引 3)使用 ALTER INDEX REBUILD 语句重建索引 4)使用 ALTER INDEX RE ...
- 基于 MongoDB 动态字段设计的探索 (二) 聚合操作
业务需求及设计见前文:基于 MongoDB 动态字段设计的探索 根据专业计算各科平均分 (总分.最高分.最低分) public Object avg(String major){ Aggregatio ...