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中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...
随机推荐
- mysql学习笔记1(mysql的基本架构)
mysql基本架构图 如图所示: 1 . MySQL 可以分为 Server 层和存储引擎层两部分 Server 层包括连接器.查询缓存.分析器.优化器.执行器等,涵盖 MySQL 的大多数核心服务功 ...
- 网站滑到指定的位置给div添加动画效果
<!DOCTYPE html> <html> <head> <style> .anim-show { width:100px; height:100px ...
- Vue知识点回顾(一)
一.什么是vue? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不 ...
- 怎么让我们的mac运行得更加流畅?让我们得工作事半功倍!
古语云:"工欲善其事,必先利其器."因此,一个运行流畅的Mac更能使我们的工作事半功倍.但又是什么导致电脑的运行不流畅呢? 其实这大多还是缓存垃圾过多.内存不足的原因.尝试安装了许 ...
- 检查字符串结尾 判断一个字符串(str)是否以指定的字符串(target)结尾。
function confirmEnding(str, target) { var arr = str.replace(/\s+/g, ""); var bb = arr.subs ...
- python3使用HTMLTestRunner生成测试报告
自动化测试运行完了需要直观的了解测试结果,需要用到第三方的模块HTMLTestRunner. 一:下载 HTMLTestRunner 下载路径:https://pypi.python.org/pypi ...
- Leetcode1 - 10
1. 两数之和 class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { ...
- Mac 安装Homebrew慢的问题解决
一开始安装,在官网上的命令: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...
- linux下安装python3.7.1
一.安装依赖环境 输入命令:yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readlin ...
- 发现了一个关于 gin 1.3.0 框架的 bug
gin 1.3.0 框架 http 响应数据错乱问题排查 问题概述 客户端同时发起多个http请求,gin接受到请求后,其中一个接口响应内容为空,另外一个接口响应内容包含接口1,接口2的响应内容,导致 ...