欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

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

我总结为差不多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()函数是怎么说的?

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

          

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

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

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

                   从中总结一下 表达出是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指向该内存空间。  如图所示php最基础的东西,面试必备


  

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

                             所以使用  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.  

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

弄懂了?