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中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...
随机推荐
- Linux提权(持续更新)
利用/etc/passwd提权 个人认为,这种提权方式在现实场景中难以实现,条件太过苛刻,但是建立Linux下的隐藏账户是个不错的选择,灵感来自:https://www.hackingarticles ...
- Ubuntu16.04安装搜狗输入法报错:dkpg:处理归档sogoupinyin.deb(--install)时出错,安装sogoupinyin将破坏fcitx-ui-qimpanel
系统:ubuntu16.04 事件:安装搜狗拼音时报错 报错信息(ubuntu语言是英文的报错信息): dpkg: regarding sogoupinyin_2.3.2.07_amd64-831.d ...
- Mac太卡了怎么办?用CleanMyMac四招让它飞起来
许多小伙伴使用Mac后都反馈电脑不如想象中的流畅,甚至有点卡顿的现象,原因可能是因为无用的应用占据了过多的内存,或者是系统盘垃圾过多,导致的电脑卡顿现象. 今天小编教给大家几招,让自己的Mac能够一键 ...
- 吉他指弹入门——贝斯(walking bass)
在每一个乐队中都有一个神秘而低调的乐手,在现场演奏中你甚至感觉不到他的存在,但是他又异常重要.即是鼓手打拍的好伙伴,又是吉他手忘乎所以solo时的警报器.没错,这个人就是贝斯手.要是我们做了什么气跑了 ...
- 能否安装 CrossOver 上没有的软件
系统兼容软件CrossOver可以像虚拟机一下帮助我们在Mac或者Linux上运行Windows应用程序,快速实现跨平台文件互通,所以我们也称它为类虚拟机. 不需要安装Windows操作系统的Cros ...
- 分布式监控系统之Zabbix proxy
前文我们了解了zabbix 使用snmp和jmx信道采集数据的相关使用配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14029864.html:今天我们来 ...
- 【电子取证:FTK Imager篇】DD、E01系统镜像仿真
星河滚烫,人生有理想! ---[suy999] DD.E01系统镜像动态仿真 (一)使用到的软件 1.FTK Imager (v4.5.0.3) 2.VMware Workstation 15 P ...
- C++基础知识篇:C++ 基本语法
C++ 基本语法 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互.现在让我们简要地看一下什么是类.对象,方法.即时变量. 对象 - 对象具有状态和行为.例如:一只狗的状态 - 颜 ...
- Python实现树莓派摄像头持续录像并传送到主机
关于树莓派,想必从事嵌入式开发的开发者都有听过,树莓派原名为Raspberry Pi,也就是它的英文读法,树莓派诞生于英国,由"Raspberry Pi 基金会"这个慈善组织注册开 ...
- 《STM32CubeMX配置STM32H743XI工程》第一讲《初始化UART,重定义printf函数,点亮一个LED灯》
1.打开STM32CubeMX软件->新建一个工程(软件自行到ST官网下载安装) 2.输入对应的芯片型号(本次基于野火STM32H743XI Pro 开发板)点击Start Project生成项 ...