php最基础的东西,面试必备
我总结为差不多10个关于这方面基础的知识点。有些是借鉴网上的其它资料做的总结
一. empty () , isset() 函数的彻底理解和使用。
<?php
$a1 = null;
$a2 = false;
$a3 = 0;
$a4 = '';
$a5 = '0';
$a6 = 'null';
$a7 = array();
$a8 = array(array());
echo empty($a1) ? 'true' : 'false';
echo empty($a2) ? 'true' : 'false';
echo empty($a3) ? 'true' : 'false';
echo empty($a4) ? 'true' : 'false';
echo empty($a5) ? 'true' : 'false';
echo empty($a6) ? 'true' : 'false';
echo empty($a7) ? 'true' : 'false';
echo empty($a8) ? 'true' : 'false';
?>
看看上面的代码会输出什么东西。 结果是: true
true true true true false true false
我最初的分析结果,错在第三个。我先说说分析过程,之后再仔细看详细函数介绍和使用。
首先: $a1 null 对于一个 值为null 先从字面上理解 肯定为 true
$a2 false 肯定也是为true的
$a3 0 这个地方的时候我彻底崩溃了 之前没全面理解empty的真正含义 我写了false
$a4 '' 一看空字符串 肯定为 true
$a5 "0" 之前记得过 "0" 是empty true
$a6 "null" 这个肯定是迷惑你对null的理解 ,一看是个圈套 ,这个字符串叫 "null"和null完全不同 true
$a7 array() 空素组 肯定的empty true
$a8 array(array()) 这个是一个非空数组 尽管里面有一个空数组元素 ,但是本身这个整体数组是非空的 true
假如你对每个答案都是肯定的然后和答案一致了,说明你确实底子比较扎实了。但是如果错了任何一个都说明基础没有扎实。
翻开手册看看empty()函数是怎么说的?
标准的定义 , 当一个变量不存在或者 它的值等同于FALSE,就说明、empty会返回true 表示不存在。 也就是说我们进行判断的变量要把它变为bool类型然后假如
是false才会认为是空,否则是非空。那就好办了 看看 在php里什么表示 true 什么表示 false, 下面是手册给出的表格。
从中总结一下 表达出是false的一些特殊的字符串或者数字。按照类型来记一下
对于字符串来说 空字符串 "" "0" 就这两个,其他为true.
对于数字类型来说 0 0.0 非0的数字都为true.
对于定义未给赋值或者赋值为null 肯定为false
对于 Array数组来说 非空都是true 也就是count($array) !=0 表示true
对于Object对象来说 我测试了一下一个类是空类/初始化属性都没赋值 都是true
现在通过总结来看,其实也没表上面那么复杂。 字符串就2种情况 "" "0" 数字就0 0.0 数组就空数
组 null 未定义 都是false,这个比较容易看出。回过头再看看这个题目 清晰明了。 其实empty和isset有一点关
系, empty的判断有点类似是 !isset () |(转以后的true/false)
则 isset($var) 的定义是 此变量是否已经设置并且不是 null 则返回true. 现在isset和empty你应该
感觉不会乱了,是的empty在 ! isset()的情况下还会去看是否转义为bool值的情况,最终才会返回结果。
二.unset() 的诡异之处
<?php
$a="hello world";
$b=&$a;
unset($a);
var_dump($a);//变量不存在
var_dump($b); //输出hello wolrd
?>
上面代买在没给注释之前,你是不是以为两个都不会有输出? $b的输出让人感觉很诡异 ,后来我才知道我们考虑问题不周全。
unset($a) $a是什么 ,变量啊。销毁变量理所应当,下面$a确实没有值。 但是 $b是什么 ,$b是$a的引用
,说明该内存空间"hello world"还有变量去指向它,所以没有被内存回收过去。我也是大致了解php垃圾回收机制,说
是有一个叫引用计数器的东西,当引用计数器为0才会被内存回收,显然本来是2 现在unset($a) 此时引用计数器还
是1 所以输出$b就会输出 "hello world". 我们unset($a) 这个只是切断$a指向 这块"hello world"内存空间的一个指向, 不影响$b指向该内存空间。 如图所示
所以使用 unset($var) 注意 你要销毁的是,简单来说就是创造这个变量值的创始人的话 ,例如 $a="hello world"
从代码上看,它是第一个创建它的。此时引用计数器加1. 只要改=该内存块不得引用计数器不为0,这个内存不会被销毁。 假如
所一块内存地址的所有指向即引用计数器为0的话 ,才会被内存回收垃圾。
还有unset($var)在函数function中调用的情况:
<?php
function destory(&$data)
{
unset($data);
}
$data="hello world";
var_dump($data);// hello world
destory($data);
var_dump($data);// hello world
?>
奇怪! 不是说传引用过去就是对原数据快修改吗,怎么又没有unset掉? 这个确实让人难以理解,我只能记下来了。大家要是要彻底学习,去网上找找资料,我也不能乱分析。手册上有这一条,大家可以看看
三. strlen 和 mb_strlen mb_substr()//截取中文 字符编码从 \x4e00-\x9fa5表示Unicode中文编码
<?php
$str="你好,world";
var_dump(strlen($str)); //输出 6+6=12
var_dump(mb_strlen($str,"UTF-8")); //输出 6+2=8
?>
如果看到第一个 不看注释,你以为会输出8的话会大错特错! 默认strlen表示的是字节数,mb_strlen表示个数和字符集有关。 现在php默认字符集为UTF-8,一个中文是3个字节 ,后面英语一个单词一个字节就是 12个字节。 mb_strlen就是按照字符数来算的,2个中文以及后面6个字符就是 8个字符。
四. in_array() 函数的诡异
<?php
$data=["marry","tom"]
var_dump(in_array(0,$data)); //输出 true
?>
诡不诡异! 我判断 0是否在这个 $data的数组里面,竟然输出 true.于是一查手册,真相大白,我们认为很简单的函
数,后面后又第三个参数boolean. true表示为严格模式,否则是非严格模式。严格模式是要判断和数组元素数据类型一致并且值相
等的,判断是否在此数组内。
为什么上面代码会输出true? 首先会把 "marry"变为数字,再和0相比较。 "marry"变为数字为0 自然 0==0 返回true. 假如我们假如了第三个参数严格模式,则返回false.
下次分析数据类型之间转换的规则是什么。 有利于我们笔试/面试,或者在写代码的过程中也是有帮助的。因为这些是我们常常以为"简单"的东西,说到底你真的
弄懂了?
上一篇: Redis基础知识总结(面试必备)