php中的坑,你掉进去过几个?

  1. ‘abc‘ == 0 return true

    因为这是一个数字和一个字符串进行比较,PHP会把字符串转换成数字再进行比较。PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。例如:123abc转换后应该是123,而abc则为0,0==0这当然是成立的.具体可以参考官方手册:如果比较一个整数和字符串,则字符串会被转换为整数

  2. null和空、0,三个值的比较

在PHP中,== 会先进行类型转换,再进行对比,而===会先比较类型,如果类型不同直接返回不相等,参考如下示例

    $a = null;
    $b = ‘‘;
    $c = 0;
    echo ($a == $b)?1:0;    // 输出1
    echo ($a === $b)?1:0;   // 输出0
    echo ($a == $c)?1:0;    // 输出1
    echo ($a === $c)?1:0;   // 输出0
    echo ($b == $c)?1:0;    // 输出1
    echo ($b === $c)?1:0;   // 输出0

3.foreach里的引用赋值,参见官方文档

在官方文档里有一句警告:Warning 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

我们看一组代码:

$a = [1,2,3];
foreach($a as &$item){
    echo $item . ‘,‘;
}
//unset($item); // 引用赋值后不销毁对象
foreach($a as $item){
    echo $item . ‘,‘;
}

上面的代码的输出如下:

1,2,3,1,2,2 看最后一个输出的是2,而不是3,就是因为代码里没有销毁$item造成的,原因如下:

第一个循环,把3的引用赋给了$item,第二个循环,把1赋给了$item,因为$item是引用,导致数组的元素3变成了1,明白了吗?

4. isset与empty的联系和区别

empty对如下8种情况返回true:

null、 空串""、字符串0"0"、空array、布尔值false、数字0、浮点数0.0、类里用var定义但是未赋值 www.stuhack.com

isset 检测变量是否设置,并且不是 NULL,但是对于empty的8种情况,只有null返回false,其它7种情况都返回true

综上所述,除了empty描述的的非null的7种情况,在其它情况下, if(empty(变量)) 等效于 if(!isset(变量))

5. strrchr函数

在W3School站点上的注释如下:

strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

如果成失败,否则返回 false。

实际上,这个函数是查找某个字符,而不是查找字符串,应该参考官方文档

代码示例:

$a = ‘abcdef.txt‘;
$b = ‘.php‘;
echo strrchr($a, $b);

上面的代码输出是:.txt

也就是说,如果$b是字符串,只使用第一个字符,后面的其它字符会忽略

注:php提供了strstr函数,为什么不提供strrstr函数呢,虽然自己实现也很简单

时间: 2024-08-10 01:37:36

php中的坑,你掉进去过几个?的相关文章

Windows API中的坑

本文主页链接:Windows API中的坑 ExpandEnvironmentStrings 风险: 进程会继承其父进程的环境变量,在展开如%APPDATA%等目录时,有可能父进程对此环境变量进行过修改,那么可能你获取的就不是你想要的当前SESSION的%APPDATA%了. 建议: 使用SHGetFolderPath系列函数来做这件事. GetModuleFileName 风险: 在DLL中调用时,若传入的instance参数为NULL,那获取的将是加载DLL的进程的EXE的路径,若需要获取D

Torch-RNN运行过程中的坑 [2](Lua的string sub函数,读取中文失败,乱码?)

0.踩坑背景 仍然是torch-rnn/LanguageModel.lua文件中的一些问题,仍然是这个狗血的LM:encode_string函数: function LM:encode_string(s) local encoded = torch.LongTensor(#s) for i = 1, #s do local token = s:sub(i, i) local idx = self.token_to_idx[token] assert(idx ~= nil, 'Got invali

Torch-RNN运行过程中的坑 [1](读取Lua非空table,size为0)

0.踩坑背景 执行Torch-RNN的时候,在LanguageModel.lua中的encode_string函数中,对start_text的各个character进行id映射编码,实现功能类似"北京天安门"-->"5 10 88 32 111",方便后面的计算. 这个函数会利用一个全局的类似HashMap的table,hashmap中的key是character(char),value是id(int),涉及到一个从hashmap中按照key取值的操作,代码如

MVC 4中的坑

1.VirtualPathUtility.ToAbsolute 这个方法的官方解释是 Converts a virtual path to an application absolute path. 意思是应用程序虚拟路径转换为绝对路径 但实际是取不到绝对路径的 VirtualPathUtility.ToAbsolute("~/App_Data/"); 这个取到的实际是 C:/App_Data 这个目录 需要取绝对路径还是需要 System.Web.HttpContext.Curren

Objective-C 中的方法回掉

Objective-C 中的方法回掉  Objective-C 中的方法调用 OC 类似C+,避免不了的内部的各种通信手段,函数调用,变量传递等,避免不了各种回掉等. 一.class直接调用 或者 obj调用 OC内方法主要分为两种,一种  “-” 开头的实例方法,这种方法顾名思义,一定要有具体的实例对象才能去掉用. 如: [obj methodName]: 另一种是以 “+” 开头的静态方法,这类方法一般不通过创建对象就能调用,直接通过 [ClassName StaticMethodName]

memset()函数中的坑

一 写在开头1.1 本节内容内存填充函数memset()中的坑. 二 函数原型 1 /* 来自man memset */ 2 #include <string.h> 3 void * memset(void * s, int c, size_t n); 功能描述:memset()函数用常量c的值填充由指针s所指向的内存地址空间的前n个字节的内存空间. DESCRIPTION : The memset() function fills the first n bytes of the memor

记学习PHP掉进去的第一个坑

从前几天开始刚开是学习PHP,就经历了一个坑,让人确实挺郁闷的,主要是因为开发环境的问题. 直接切入正题. =================================================================================================== 实验环境:PHPStorm2016 + Xampp 在学习使用表单的post方法接受数据一节时,怎么也接受不到数据,不知道怎么回事.代码如下 <form name="form1"

实用技巧(掉进去又爬出来的坑儿)

1.将字符型的字段转化为整形进行排序 1     # Django实现将字符型的字段转化为整形进行排序 2     # mysql数据库(不同的数据库会有迁移问题) 3     # Goods:模型类 4     # productnum:销量 5     # extra:一个Django的拓展查询方法,参数select是个字典 6     goods = Goods.objects.extra(select={'p': 'productnum+0'}) 7     goods = goods.

新手开公司创业,这些坑千万别掉进去!

1.作为一个创业新手究竟应该怎么开好公司呢? 2.你该准备些什么? 3.你适合自己开公司当老板吗? 4.如果适合,下一步应该做什么? 开头之后抛出4个问题,一方面是验证创业想法是否坚固,另一方面是验证自己是否适合创业并且在创业这条坎坷的道路上一路走远呢? 01.对自己有充分的了解 首先是自己的心态,想通过创业迅速致富的人不适合创业. 创业是个长期的过程,急于求成,为了赚钱而创业的人很难在创业初期最艰难的时侯坚持下来,这基本上已经成了创业失败的普遍定律. 其次评估自己可以冒多大的风险.创业永远与风