• 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字符串你不知道的事的更多相关文章

  1. setTimeout,setInterval你不知道的事

    javascript线程解释(setTimeout,setInterval你不知道的事) 标签: javascript引擎任务浏览器functionxmlhttprequest 2011-11-21 ...

  2. JavaScript 你不知道的事 -- 关于函数

    接上篇Javascript 你不知道的事,直接条列了: 每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto__ ...

  3. 子字符串查找之————关于KMP算法你不知道的事

    写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法 ...

  4. Javascript中那些你不知道的事之-- false、0、null、undefined和空字符串

    话不多说直接进入主题:(如果有写的不对的地方欢迎指正) 我们先来看看他们的类型分别是什么: typeof类型检测结果 结论:false是布尔类型对象,0是数字类型对象,null是object对象,un ...

  5. string.Format之你不知道的事

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  6. 数据存储(一)--SharedPreferences之你不知道的事

    一.SharedPreferences将数据文件保存在指定路径上 SharedPreferences原则上是仅仅能保存在当前应用程序私有的shared_prefs文件夹中,只是也不是绝对的,我们能够用 ...

  7. JS中字符串那些事~

    1:字符串 JS中的任何数据类型都可以当作对象来看.所以string既是基本数据类型,又是对象. 2:声明字符串 var sStr = ‘字符串’;(常用) var oStr = new String ...

  8. VI 你不知道的事

    1G 顶部 G 底部 ctrl+F 前进 ctrl+B 后退 /text   向前搜索 ?text 向后搜索 I i 插入字符串 a 光标后插入字符 A 跳到句末尾 wq 写入并退出 h k j l ...

  9. Javascript 你不知道的事,好吧,是我不知道的事

    NaN表示一个不能产生正常结果的运算结果.它不等于任何值,包括它自己.可以用isNaN(number)来检测. 同Java中的字符串一样,JS中的字符串是不可变的.也就是说一旦字符串被创建,就无法改变 ...

随机推荐

  1. 面经分享!蚂蚁金服三面被拒,重拾起鼓四面猿辅导成功拿下offer!

    前言 一直有小伙伴要我分享面经,说自己想面互联网公司,无奈经验太少想多看看其他人是怎么面的.我这两天刚好和一个刚拿到猿辅导offer的朋友吃了个饭,他向我说了说自己的面试经历.粉丝朋友是末流211毕业 ...

  2. 怎么在word里编辑插入数学公式?

    大学时代我们都有一个共同的噩梦--高数.每次上完高数课都有一些数学公式.可是我们最难的就是想用电脑在word中做笔记的时候该怎样用word插入公式.Word中自有的公式太少,新公式又太难输入.这也是一 ...

  3. JUC并发工具包之CyclicBarrier

    1.简介 CyclicBarrier是一个同步器,允许多个线程等待彼此直到达一个执行点(barrier). CyclicBarrier都是在多个线程必须等到彼此都到达同一个执行点后才执行一段逻辑时才被 ...

  4. Windows下创建指定大小的文件

    前言 因为需要测试存储容量,所以需要能生成指定大小的文件. 执行 #语法:fsutil file createnew 路径和文件名 文件大小 fsutil file createnew D:\test ...

  5. TIOBE 11月指数:C语言居首,稳居宝座,Python直逼第二!

    官方网址:https://www.tiobe.com/tiobe-index/   ​ 这是自近20年前TIOBE指数开始以来,Java和C第一次不再占据前两位.C仍然是第一位的,但是现在第二个位置是 ...

  6. 网络篇:朋友面试之TCP/IP,回去等通知吧

    前言 最近和一同学聊天,他想换工作,然后去面了一家大厂.当时,他在简历上写着精通TCP/IP,本着对TCP协议稍有了解,面试官也不会深问的想法,就写了精通二字.没想到,大意了 关注公众号,一起交流,微 ...

  7. CentOS下的IPMI尝试

    1.载入支持 ipmi 功能的系统模块 modprobe ipmi_msghandler modprobe ipmi_devintf modprobe ipmi_poweroff modprobe i ...

  8. C++实现任意进制的相互转换

    进制转换是计算机内部时时刻刻都在进行活动,本篇文章也是进制转换的算法介绍,不过不同的是我想利用ascll编码实现2到61之间任意进制的相互转换,更大进制的表示方法只不过是十六进制表示方法的延伸:用字母 ...

  9. Nacos windows下 ERROR Nacos failed to start, please see

    如果是windows 本地启动 直接到你本地\nacos\bin下   用cmd 启动即可 startup.cmd -m standalone 看见它你就算是 完成 了   直接访问下本的的端口  h ...

  10. 第二十三章、 Model/View便利类表格部件QTableWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 表格部件为应用程序提供标准的表格显示工具,在表格内可以管理基于行和列的数据项,表格中的最大 ...