作为程序员一定要保持良好的睡眠,才能好编程

php面试题全面解析(1)

发布时间:2017-11-08

1117.rar


面试过程中经常会遇到各种各样的面试题,那么我们如何才能全面解析,全面了解呢

现在我们就来一一的解析写着面试题:


1、看看面试题都有哪些知识点


    php中定义字符串的有几种方法,这几种方法有什么不同

    这个面试题好像学习过php的都知道,那么我们能不能延伸出其他的考点呢?

    一、单引号

    二、双引号

    三、heredoc和newdoc 比较类似,我们归为一种

    

    区别:单引号不解析变量

              单引号不解析转义字符,只能解析单引号和反斜线本身

              变量和变量、变量和字符串、字符串和字符串之间可以用.连接。

            

             双引号解析变量 变量可以使用{ } 包含

             双引号解析所有的转义字符

             双引号也是可以使用.来连接

        

        那么有了上面的分析,可以很明确的看出 使用单引号的 效率会更高一些。

       

    还有一种就是heredoc和newdoc 这两种都是处理大字符串的。

        例如:

        $newStr=<<<EOT

        sdafsadf

        str

        str

EOT;

        heredoc解析变量 解析全部的转义字符

        最后的结束符  EOT; 必须要顶格写

 



    知识点的延伸

    数据类型 八大数据类型

    (标量、符合、特殊)

    


    标量:字符  整形、

                浮点类型

                浮点类型不能在计算进行比较,精确的说是不能用于相等


    例如:

        $a=0.1;

        $b=0.7;

        if($a+$b==0.8){

            echo 1;

        }else{

            echo 0;

        }

        这个输出结果 是  0   为什么会这样说?

        因为电脑cpu会将数值转换为 二进制的字符   就是01010101 类似这样的值,那么在计算中,就会得到 一个小于0.8 的值,

        就是0.79999999...这样的一个值,因此  在电脑中 0.1+0.7 这是不等于 0.8的。

        

        布尔类型:

        false的七种情况:

         0,0.0,' ' ,'0',false, array(),null,

         整形0,浮点0.0,空字串,字符串0,false,空数组,null

        

        数组类型,超全局数据

        $GLOBALS:

        $_REQUEST:

        $_GET:

        $_POST:

        $_COOKIE:

        $_SESSION:

        $_SERVER:

        $_FILES:

        $_ENV:


        以上的我们不多说,我们都学过

        那么我们着重的来看看 $_SERVER[] 这个全局变量


        $_SERVER['REMOTE_ADDR'];获取客户端的IP地址

        $_SERVER['SERVER_ADDR'];服务器的IP

        $_SERVER['SERVER_NAME'];服务器名称

        query_string 访问字符串?后面所有的参数

        request_time 访问时间

        http_referer  上一级访问的url地址

        http_user_agent 访问

        request_uri

        script_name

        php_self

        path_info 这个url地址中路径的名称

        request_method 访问方法

        document_root 文件所在的目录

        HTTP_HOST url host 域名的地址

        SERVER_PORT 服务器端口


        


    

        $path="/usr/local/www/weixin/a.jpg";

        basename($path) //a.jpg //得到文件的名称

        dirname() // /usr/local/www/weixin 这是路径

        pathinfo($url)  //会得到一个数组,数组包含  dirname  basename extension  filename 这是数组中的关联属性

                

          


        例如:

        http://www.xiaosongit.com/index.php/user/reg?status=ghost

        

        这个url地址呢,

        path_info 就是  user/reg 这的路径       

        query_string就是这个值:status=ghost



        null        三种情况

        直接赋值为null    

        未定义的变量

        unset销毁的变量也是null

        

        

        常量 两种定义方法:

        const:const更快,是语言结构

        difine:difine是函数

      

        define不能用于类常量的定义,const可以。

        常量一经定义,不能被修改,不能被删除

        

        那么为我们预定义的常量有哪些?

        

        __FILE__    返回所在文件的目录与文件名

        __LINE__    返回行号

        __DIR__    返回所在的目录

        __FUNCTION__    返回函数

        __CLASS__    返回类名

        __TRAIT__    

        __METHOD__    返回所在类的函数方法

        __NAMESPACE__    类的命名空间 

            

        PHP_OS  系统

        PHP_VERSION  php版本

        PHP_EOL  系统换行符

        M_PI        圆周率

        

      

        

        

       


    运算符考点

        

        foo() 和 @foo() 之间的区别

        @错误控制符  抑制错误的输出


        PHP支持一个错误运算符:@ 。将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都会被忽略掉。




        所有的运算符考点

        运算符的优先级:

                 

        w2.jpg


    递增递减>算数运算符

    大小比较>逻辑与与逻辑或

    三目>赋值

   

    括号的使用可以增加代码的可读性,推荐使用。                

        



    以下这两种逻辑运算符号是最低的:

     and

      or


    比较运算符

    ==

    ===

    等值判断  false的七种情况

          整形0,浮点0.0,空字串,字符串0,false,空数组,null


    递增、递减运算符不影响布尔值

    

    递减null值是没有效果的还是null,递增null值为1

   



    

    递增和递减在前就先运算后返回,在后就是先返回后运算

   w3.jpg

   以上就是这样的结果


    再看看这个结果: 1/1/2

    w4.jpg


    好,我们再看看下面这个方法:

    w5.jpg

    我们来看看这个代码:

       

    w6.jpg

    

    

    null 递减还是null  未定义的变量本身就是null  再次递减也是null

     如果未定义的变量进行了递增,那么就是 1 如果再次递增就是2  甚至3,依次类推


    w7.jpg

    

    逻辑运算符:

    短路作用

    ||与&&与or和and的优先级


    那么看看有哪些短路的:

    w9.jpg


    很明显第一个,true

    第二个  返回  false  因为前边是  false  后边就不会执行了,因此是 false

    

    $a=false || true;   //true

    

    $b=false or true;  //false

   w10.jpg

    这个考察点就是  赋值运算符和  逻辑与 逻辑或的  对比。


        w11.jpg

    

    我们来分析一下这个题: 整体运算是true     $a 的值是false   

    优先级会影响我们最后的结果


    真题:

    w12.jpg

    

这里的输出结果就是  1   1

   

true再次递增还是true  不会变成2 


true++ 不会变成2  还是true

false++ 还是false  ++false 还是false


大于小于运算符号大于逻辑运算符号  因此  3>0 成立  ,然后  把 $a赋值成 true 

   $b=3>0  这里已经短路了,没有执行


因此 $b的值还是  0


然后通过   $a++    和  $b++ 因此这样就得出  都是 1


$a=0;
    $b=0;
    if($a=3>0 || $b=3>0 ){
        
        var_dump($a,$b);
        echo "<br>";
        $a++;
        $b++;
        
        echo $a."\n";
        echo $b."\n";
        
    }

 

因此这里就是  1 1

    

    


流程控制考点:



break;


continue;



  请列出3中php数组循环操作的语法 ,并注明各种循环的区别


 for($a=1;$a=100;$a++){

        

 }


 while(){


 }


foreach(){

    

}


分支结构:


for循环只能遍历索引数组,foreach可以遍历索引和关联数组

联合使用list() ,each() 和 while() 循环也是可以遍历索引和关联数组的。


 

while list  each 组合不会reset()


foreach遍历数组会首先进行reset() 操作



if...elseif

在elseif语句中只能有一个表达式为true  ,即 在elseif 语句中只能有一个语句块被执行。

多个elseif从句是排斥关系。

在使用if else语句 的一个基本原则就是 要把范围小的语句放在最前面。





switch  case  default

switch($var)

这个$var 的格式必须是下面的这几种:

和if不同的是,switch后面的控制表达式的数据只能是 整形,浮点类型 或者字符串

其他的不行



continue;  在 switch 中  相当于 break;


调处switch 外的循环可以使用  continue 2;  跳出两层循环。


跳转表,直接跳转到对应的case


真题解答:

php中如何优化多个if...elseif 语句的情况?

1、表达式可能性越大,出现高的就向前提,减少判断的次数,提高效率。

2、如果判断的值为 整形,浮点型、或字符串,那么可以考虑使用  switch 这个方法,从而提高效率。






自定义函数及内部函数考点


真题:


    变量的作用域和静态变量

    

    w13.jpg

    如果函数体内,想要使用全局变量,那么可以使用 global 拿到内部来使用

    

    也可以使用$GLOBALS['outer'];

    

    静态变量   static

    static关键字:

    1、仅初始化一次

    2、初始化时需要赋值

    3、每次执行函数该值会保留

    4、static修饰的变量是局部的,仅在函数内部有效

    5、可以记录函数的调用次数,从而可以再某些条件下终止递归。

        w15.jpg

    应证了 1/2/3条

    

    w16.jpg


    这就是这个题的执行结果:51

    本身  带光标  这行 的输出应该  是 null   但是  null 在页面中任何都不输出,因此就是  51


    static 只执行一次,且执行后的结果  一直保留,再次调用就是上一次的值,累加

    


    函数的参数及参数的引用传递

    默认情况下,函数参数通过值传递

    如果希望修改函数的值,必须通过引用引用传递进行。

    w17.jpg

    如果是这个输出,那么结果  是  2



    函数的返回值及引用返回

    return

    当函数体中 遇到  return  函数体后面的代码不执行。

    返回调用函数代码出。

    如果不写 return  那么函数自动返回  null

    


    从函数返回一个引用,必须在函数声明和调用函数都是用引用运算符 & 才可以。

    name

   



        w21.jpg

      //请输入你的php代码    
      function &my(){
       
           static $b=10; //静态变量只初始化一次
            return $b;
         }
         var_dump(my()); //10
         $a=&my(); //这个$a 拿到的就是 $b 的地址引用
         $a=100;  //那么修改$a的引用地址($b的值为100)
         var_dump(my());  //100



    外部文件的导入

        include

        require   

    

    include 结构会发出一条警告 (E_WARNING)脚本会继续执行

    require 会发出一个致命的错误(E_COMPILE_ERROR)导致脚本的终止

    

    include_once()

    require_once()

    唯一的区别是php会检测该文件是否被包含,如果包含,就不会再次包含了。


    系统内置函数

    

    时间处理函数:

    date()

  

    strtotime();

    mktime()

    time()

    microtime()

    date_default_timezone_set("Asia/Shanghai")   //中国时区

    

    IP处理函数:

    ip2long();

    long2ip()

    

    打印函数:


    print()

    echo()  可以打印多个变量,可以使用逗号隔开

    sprintf

    printf

    print_r

    var_dump()

    var_export()


    序列化和反序列化

       serialize() //序列化

        unserialize() 反序列化


    字符串处理函数

    stristr()

    strpos()

    strrev() //字符串翻转


    数组处理函数:

    array_keys() 返回数组的key

    array_values() 返回数组的values

    array_diff() 返回两个数组的差集

    array_intersect(); 返回数组的交集

    array_merge() 返回两个数组的合并

    array_shift();

    aray_unshift()

    array_pop()

    array_push();从后边放入

    sort() 

    ksort()

    shuffle() 打乱数组顺序


    

w22.jpg

      

        $var1=5;
        $var2=10;
        function foo(&$my_var){
            
            global $var1;
            $var1+=2;
            $var2=4;
            $my_var+=3;
            return $var2;
            
        }
        
        
        $my_var=5;
        
        echo foo($my_var)."<br>";
        echo $my_var."<br>";
        echo $var1."<br>";
        echo $var2."<br>";
        $bar='foo';
        $my_var=10;
        echo $bar($my_var);


    这道题的输出结果就是:4 8 7 10 4



     正则表达式考察


    手机号的正则表达式编写 

    背下来不是特别灵活,希望灵活的掌握

    正则表达式的组成部分


    正则表达式的作用:分割,查找,匹配,替换


    正则表达式 分隔符: /   #  以及取反符号 ~


    通用原子: \d   \D     \w      \W     \s     \S

    分别代表什么意思呢?

    \d 0-9

    \D 0-9 取反

    \w a-z A-Z _ 0-9 数字 字母下划线

    \W 不是数字 字母下划线

    \s  空白符

    \S 除了空白符


    . 除了换行符的任意字符

    * 0个或1个或多个

    ?0个或一个

    + 一个或多个

    ^ 以什么什么开头

    $ 以什么什么结尾

    {n} 恰好出现 n次

    {n,} 恰好出现n或大于n次

    {n,m} 出现n到m次

    [] 集合

    () 后向引用

    [^]取反

    | 或者

    [-] 范围


    模式修正符

    i 不区分大小写

    m 每一行进行匹配

    e 可以做一些php的处理,

    U

    u 中文匹配可以用这个。

    

    后向引用

    

    $1 或  \\1

    把前面匹配到的,放在后边使用,我们把这种模式叫做后向引用

    看个例子吧

    $str="<b>abc</b>";

    $pattern='/<b>(.*)<\/b>/';

    preg_replace($pattern,'\\1',$str);  等同于 preg_replace($pattern,'$1',$str); 
    这样就把<b>这样的标签去掉了。

    

    以13或15开头的手机号验证格式:

    /^13\d{9}|15\d{9}$/

    

    正整数:

        /^[1-9]\d*$/

        

    整数 可以包含负数或整数

    /^-?[1-9]\d*$/   - 可以有也可以没有


    邮箱:

    /[\w-]+@[\w-]+\.[\w-\.]+/


    

    



    贪婪模式

    

    .*?    取消贪婪模式

    /U    取消贪婪模式


   w23.jpg

    w24.jpg


w25.jpg

//请输入你的php代码
    $str="<b>abc</b><b>bcd</b>";
    $pattern='/<b>(.*?)<\/b>/';
    //$pattern='/<b>(.*)<\/b>/U'; //这种方式也以
    $str=preg_replace($pattern,'$1',$str);
    echo($str);

    


    中文匹配的一个点:

    w26.jpg

    

    匹配源代码中所有的图片 src

    w27.jpg


这样就能匹配到了。



   匹配中文:

 $pattern='/[\x{4e00}-\x{9fa5}]+/u';


    w28.jpg

这就是匹配到的中文字符

   

     $pattern='/[\x{4e00}-\x{9fa5}]+/uU';


    如果我们在后面加上一个大写U

    那么:

    w29.jpg

    就是如图这种效果了。


    

    文件及目录处理

    

    对于文件读取和写入的操作


    目录操作函数和其他文件操作


    fopen() 用来打开一个文件  打开需要指定一个打开模式

        r r+ r是读模式   r+ 是读写模式 如果是这种模式的话,会替换掉前边的字符

        w w+ 当文件不存在会创建一个

        a a+ 文件指针会指向末尾,如果文件不存在就会创建一个文件。

        x x+ 创建一个文件  x+ 创建并以一个读写的形式打开

        b 打开一个二进制

    fwrite()

    fread()

    fgets()

    fclose()            

      

      file_get_contents()

      file_put_contents()

        

      访问远程文件必须开启  allow_url_fopen 这个函数      才能使用curl 等这样的函数。



    目录相关的操作函数: basename()     pathinfo()   dirname()

    目录读取:    opendir   readdir  closedir  rewinddir

    目录删除:rmdir

                    mkdir


        filesize() 文件大小

        

        disk_free_space() 磁盘的剩余空间

        disk_total_space() 磁盘总共空间

        copy() 文件拷贝

        unlink() 删除文件

        


        filetype()

        rename()

        file_exists()

        is_wriable()

        filectime()

        fileatime() 获取文件最后的访问时间

        filemtime() 获取文件最后的修改时间

        

       

        文件指针:ftell  fseek  rewind


        牢记文件操作函数及文件打开模式



        理解目录的操作步骤



        尝试练习完成目录的复制和删除函数的编写

    

            切记忽略掉 . 和 ..


       


        真实题:

            

        在一个文件中不断插入helloworld


        w30.jpg

        不断的向hello.txt文件中插入 hello world 字符串,运行 一次 增加一次,运行一次 增加一次。

        

        w37.jpg

/*
        题型:读取一个文件,然后从开头的位置插入一个hello world 请编写程序            
            fopen($file,"r");
        解题:
            1、以读的形式打开文件 读取文件内容  关闭文件
            2、拼接字符串 "hello world".$content
            3、以写的形式打开文件  写入文件 关闭文件
    */
    $dir=dirname(__FILE__);
    $file=$dir."/hello.txt";
    //第一种方法
    /*$handle=fopen($file,"r");
    $content=fread($handle,filesize($file));
    fclose($handle);
    $handle=fopen($file,"w");
    $content="hello world ".$content;
    fwrite($handle,$content);
    fclose($handle);*/
    //第二种方法
    /*$handle=fopen($file,"r");
    $content="";
    while($fc=fgets($handle,24)){
        $content.=$fc;
    }
    fclose($handle);
    $handle=fopen($file,"w");
    $content="mm ".$content;
    fwrite($handle,$content);
    fclose($handle);*/
    //第三种方法
    $content=file_get_contents($file);
    $content="uu".$content;
    file_put_contents($file,$content);



        通过PHP函数的方式对目录进行遍历,写出程序

           opendir   readdir  closedir 

        

           在一个目录中,2个文件 、1个目录,此目录下还有多个文件,请写出程序

            w31.jpg

        

            w38.jpg

w39.jpg


$dir=dirname(__FILE__);     
    function loopDir($dirPath,$setp=0){
        $dirHandle=opendir($dirPath);
        while(false!==($file=readdir($dirHandle))){
                if($file!="." && $file!=".."){
                    if(filetype($dirPath."/".$file)=="dir"){
                        echo str_repeat("",$setp)."dir:".$dirPath."/".$file." 文件夹<br>";
                        loopDir($dirPath."/".$file,$setp++);
                    }else{
                        echo str_repeat(" ",$setp+1)."file:".$file."<br>";
                    }
                }
        }
    }
    loopDir($dir);


    

         会话控制:

          

            PHP的会话控制技术

                COOKIE

                    在客户端保存片段文件


                    setcookie($name,$val,$exipre,$path,$domain);


                    $_COOKIE['']; //读取


                    删除 setcookie($name,'',time()-1000);

                    

                    cookie放在客户端  不占用服务器资源

                    用户可以禁止cookie

                    将重要的文件不安全放在cookie中



            

                SESSION

                    session基于cookie

                    sessionid 存储在cookie中

                    session的值保存在服务器上。

                            

                session_start()

            

                //清空session

                $_SESSION=[];


                session_destroy() 删除session 并删除保存在cook中的sessionID


                session.auto_start

                session.cookie_domain

                session.cookie_lifetime

                session.cookie_path

                session.name   PHPSESSID

                session.save_path

                session.use_cookies

                session.use_trans_sid

                

                               

                session.gc_maxlifetime=1440


            比如禁用了cookie  那么如何传输 sessionId?

                   

                 session_name()=session_id() 放在url地址?的后面

           

                SID  这个上边这个字符串的拼接,如果开启了cookie 那么这个SID是空

                        

                w40.jpg

        

        

                

        类中的魔术方法:

            

                __construct()

                __destruct()

                __call

                __get()

                __set()

                __clone()

                __sleep()

                __wakeup()





        常见的模式:工厂模式   单例模式  注册数模式 适配器模式  观察者模式 策略模式


 

    开发环境和配置

        

    您是否使用过版本控制软件,如果有您用的版本控制软件的名字是什么


            git  svn

        集中式和分布式

            

        git 分布式  git add .


        git的简单命令


        git add  .

        git commit -m "描述"

        git rm  删除一个文件

        git status 状态

        git log

        git clone

        git init 初始化

        

        

        



        allow_url_fopen 是否打开远程文件

   allow_url_include   date.timezone  display_errors   error_reporting 错误级别

        safe_mode

  upload_max_filesize 上传文件最大    max_file_uploads 最大文件数量   post_max_size


    请简述 CGI 、fastCGI和PHP-FPM的区别


    CGI:是为了联系web服务器与代码解析器的一个协议,是一个桥梁

    fastCGI:是cGI的一个改良版本

    PHP-FPM:是一个代码解析器的一个进程。


    



    javascript和jquery基本语法与考点


    变量的定义:

        使用var来声明变量

        可以在一行中声明多个变量,多个变量以 逗号 进行分割

        声明变量但是不赋值,那么他的值是 undefined

        

        数据类型:字符串 、数字 、布尔、数组、对象、null 、Undefined

        javaScript变量均为对象,当声明一个变量时,就创建了一个新的对象。

        

        创建原生对象  new Object   {}

            

        函数内部声明的变量(var)是局部变量

            w41.jpg