php最基础的东西,面试必备

            昨天去笔试一家企业的招聘,本以为别人会问你很高深很难的东西,谁知道试卷上的题目不是关于Redis的使用,也不是负载均衡中怎么处理,更不是数据库优化。都是我们认为很"基本",很简单得不能再简单的题目。但是我错了,做题真实如履薄冰啊。比较痛苦。下面一起看一看,你基础是不是真正地扎实,真的往往基础的东西越是最难的东西。

我总结为差不多10个关于这方面基础的知识点。有些是借鉴网上的其它资料做的总结

 

           一.  empty () ,   isset() 函数的彻底理解和使用。

                    

            看看上面的代码会输出什么东西。     结果是:  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()函数是怎么说的?

php最基础的东西,面试必备_第1张图片

          

                      标准的定义 ,  当一个变量不存在或者 它的值等同于FALSE,就说明、empty会返回true   表示不存在。  也就是说我们进行判断的变量要把它变为bool类型然后假如

是false才会认为是空,否则是非空。那就好办了   看看    在php里什么表示 true   什么表示 false,  下面是手册给出的表格。

    php最基础的东西,面试必备_第2张图片

                   从中总结一下 表达出是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() 的诡异之处

 

                

                上面代买在没给注释之前,你是不是以为两个都不会有输出?          $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指向该内存空间。  如图所示php最基础的东西,面试必备_第3张图片

 

  

                      php最基础的东西,面试必备_第4张图片

                             所以使用  unset($var)  注意    你要销毁的是,简单来说就是创造这个变量值的创始人的话   ,例如 $a="hello world" 

从代码上看,它是第一个创建它的。此时引用计数器加1.   只要改=该内存块不得引用计数器不为0,这个内存不会被销毁。    假如

所一块内存地址的所有指向即引用计数器为0的话  ,才会被内存回收垃圾。

 

                           还有unset($var)在函数function中调用的情况: 

 

               

 

 

 

                          奇怪!     不是说传引用过去就是对原数据快修改吗,怎么又没有unset掉?      这个确实让人难以理解,我只能记下来了。大家要是要彻底学习,去网上找找资料,我也不能乱分析。手册上有这一条,大家可以看看。

文档参考地址:  https://www.php.net/manual/zh/function.unset.php#refsect1-function.unset-description

这种情况只能死记硬背了,就是规定。  在function里面unset通过引用传递过来的值,只是在本function里面有效,外面的变量

不受影响。

 

            三.   strlen   和  mb_strlen   mb_substr()//截取中文    字符编码从  \x4e00-\x9fa5表示Unicode中文编码

 

     

                如果看到第一个 不看注释,你以为会输出8的话会大错特错!    默认strlen表示的是字节数,mb_strlen表示个数和字符集有关。    现在php默认字符集为UTF-8,一个中文是3个字节  ,后面英语一个单词一个字节就是 12个字节。  mb_strlen就是按照字符数来算的,2个中文以及后面6个字符就是 8个字符。

 

 

               四.  in_array() 函数的诡异

 

    

 

 

 

                               诡不诡异!   我判断 0是否在这个 $data的数组里面,竟然输出  true.于是一查手册,真相大白,我们认为很简单的函

数,后面后又第三个参数boolean.   true表示为严格模式,否则是非严格模式。严格模式是要判断和数组元素数据类型一致并且值相

等的,判断是否在此数组内。

                       为什么上面代码会输出true?    首先会把  "marry"变为数字,再和0相比较。  "marry"变为数字为0    自然 0==0  返回true.     假如我们假如了第三个参数严格模式,则返回false.  

                      下次分析数据类型之间转换的规则是什么。  有利于我们笔试/面试,或者在写代码的过程中也是有帮助的。因为这些是我们常常以为"简单"的东西,说到底你真的

弄懂了?

 

 

你可能感兴趣的:(php,php,面试)