zoukankan      html  css  js  c++  java
  • PHP常见面试题总结

    1、include 和 require 都能把另外一个文件包含到当前文件中 他们有什么区别?include 和 include_once 又有什么区别?

    二者区别只有一个,那就是对包含文件的需求程度

    include 就是包含,如果被包含的文件不存在的话, 那么则会提示一个错误,但是程序会继续执行下去。

    require 意思是需要,如果被包含文件不存在或者 无法打开的时候,则会提示错误,并且会终止程序的执行。

    这两种结构除了在如何处理失败之外完全一样。

    once 的意思是一次,那么 include_once 和 require_once 表示只包含一次,避免重复包含。

     

    2、用最少的代码写一个求 3 值最大的函数

     

     

    3、表单中 get 与 post 提交方法的区别?

    3.1、GET 请求能够被 cache,GET 请求能够被保存在浏览器的浏览历史 里面(密码等重要数据 GET 提交,别人查看历史记录,就可以直接看 到这些私密数据)POST 不进行缓存。

    3.2、GET 参数是带在 URL 后面,传统 IE 中 URL 的最大可用长度为 2053 字符,其他浏览器对 URL 长度限制实现上有所不同。POST 请求无长 度限制(目前理论上是这样的)。

    3.3、GET 提交的数据大小,不同浏览器的限制不同,一般在 2k-8K 之间, POST 提交数据比较大,大小靠服务器的设定值限制,而且某些数据 只能用 POST 方法「携带」,比如 file。

    3.4、全部用 POST 不是十分合理,最好先把请求按功能和场景分下类, 对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的 2k 范围内,这样的情况使用 GET。其他地方使用 POST。

    3.5、GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「幂 等」的,在这一点上,GET 被认为是「安全的」。但实际上 server 端 也可以用作资源更新,但是这种用法违反了约定,容易造成 CSRF(跨 站请求伪造)。

     
    4、用 PHP 打印出前一天的时间
    格式是 2005-5-10 22:21:21
    echo date('Y-m-d H:i:s',time()-24*3600);
    或
    echo date('Y-m-d H:i:s',strtotime('-1 day'));

     

    5、假设现在有一个字符串 ww.baidu.com 如何使用 PHP 对他进行操作使字符串以 moc.udiab.输出?

    $str='www.baidu.com';
    //先替换,再反转
    echo strrev('www','',$str);
    

      

    6、用 php 写出显示客户端 IP 与服务器 IP 的代码

    客户端 IP:

       $SERVER[“REMOTE_ADDR”]
    

    或者

       getenv('REMOTE_ADDR');
    

    服务器 IP: $_SERVER[“SERVER_ADDR”]

     
     
    7、写个函数用来对二维数组排序

     

     

     8、'01' == '1'; 结果是 TRUE
    in_array('01',array('1'));结果是1
     

     

     

    9、简述单引号和双引号的用法 双引号串中的内容可以被解释而且替换,

    单引号串中的内容总被认为是普通字符。

     

    10、计算某段字符串中某个字符出现的次数

     (例如:gdfgfdgd59gmkblg 中 g 的次数) $text = 'gdfgfdgd59gmkblg';

    echo substr_count ( $text,'g');
     

     

    11、有一个楼梯n级台阶,每次可以上一级或两级台阶,有几种不同上法?

     这是一个经典的递归问题.也就是费波纳西级数.
    f(n) = f(n-1) + f(n-2).
    如果我们第一部选1个台阶,那么后面就会剩下n-1个台阶,也就是会有f(n-1)种走法.如果我们第一部选2个台阶,后面会有f(n-2)个台阶.因此,对于n个台阶来说,就会有f(n-1) + f(n-2)种走法.
    因此,1个台阶f(1) = 1.
    f(2) = 2,
    f(3) = 3 
    f(4) = 5 
    f(5) = 8 
    f(6) = 13 
    f(7) = 21 
    f(8) = 34 
    f(9) = 55 
    f(10) = 89 
    f(11) = 89+55 = 144 
    f(12) = 144 + 89 = 233
    .
    2.
    这类题可这样理解 
    假设走到第n阶有f(n)种走法,走到第n+1阶有f(n+1)种走法; 
    则走到第n+2阶,则可分成两种情况:
    一,最后一步是从第n阶直接登两级到第n+2阶 
    二,最后一步是从第n+1阶直接登一级到第n+2阶 
    由于从地面到第n阶,和到第n+1阶的走法已经知道 
    故从地面到第n+2阶的走法:
    f(n+2)=f(n)+f(n+1) 
    n=1时,1种走法 
    n=2时,2种走法 
    n=3时,1+2=3种走法 
    n=4时,2+3=5种走法 
     
     
    12、普通传值与引用传值及unset
    <?php
    //普通传值
    $param1=1; 
    $param2=2; 
    $param2 = $param1; 
    $param1 = 5; //变量1和变量2是两块内存,互不影响;
    echo $param2; //所以此处还是显示为1
    
    //引用传值 ↓↓
    $param1=1; 
    $param2=2; 
    $param2 = &$param1; //把变量1的内存地址赋给变量2;此时的变量2和变量1全等;
    echo $param2;// 1
    $param1 = 5; //变量1和变量2是一处内存,改变其中一个,另外一个也被改变;
    echo $param2; //显示为5
    ?>
    
    
    $a = 1;
    $b = &$a;
    unset($a);
    echo $b; //1

    首先,要理解变量名存储在内存栈中,它是指向堆中具体内存的地址,通过变量名查找堆中的内存;
    普通传值,传值以后,是不同的地址名称,指向不同的内存实体;
    引用传值,传引用后,是不同的地址名称,但都指向同一个内存实体;改变其中一个,另外一个就也被改变;

    unset并没有真正销毁变量的作用...仅仅是切断了变量与内存之间的关系,内存只要还被引用着就不会被释放; $b和$a同时指向1,切断其中$a的关系,$b还是指向1,所以上题不报错,照样输出1。

     

    13、
    //--------------如何理解static静态变量-----------
     
    /** 普通局部变量 */
    function local() {
        $loc = 0; //这样,如果直接不给初值0是错误的。
        ++$loc;
        echo $loc . '<br>';
    }
    local(); //1
    local(); //1
    local(); //1
    echo '===================================<br/>';
     
    /** static静态局部变量 */
    function static_local() {
        static $local = 0 ; //此处可以不赋0值
        $local++;
        echo $local . '<br>';
    }
    static_local(); //1
    static_local(); //2
    static_local(); //3
    //echo $local; 注意虽然静态变量,但是它仍然是局部的,在外不能直接访问的。
    echo '=======================================<br>';
     
    /** static静态全局变量(实际上:全局变量本身就是静态存储方式,所有的全局变量都是静态变量) */
    function static_global() {
        global $glo; //此处,可以不赋值0,当然赋值0,后每次调用时其值都为0,每次调用函数得到的值都会是1,但是不能想当然的写上"static"加以修饰,那样是错误的.
        $glo++;
        echo $glo . '<br>';
    }
    static_global(); //1
    static_global(); //2
    static_global(); //3
    ?>
    在 PHP 中,作用域是不重叠的,函数之外的是全局变量,

    函数内部定义的则是局部变量,二者是两个不同的变量,除非 在函数内使用 global 显式声明使用全局变量或直接用 $_GLOBALS 来引用。

     
     14、$arr = array(‘james’, ‘tom’, ‘symfony’); 请将$arr 数组的值用’ , ’分割并合并成字符串输出

    echo implode(‘ , ’ , $arr);

    $str = ‘jack, james, tom, symfony’;请将$str 用’ , ’分割,并把分割后的值放到$arr 数组中

    $arr = explode(‘ , ’ , $str);

     

    15、说出数组涉及到的常用函数

    array-- 声明一个数组
    count -- 计算数组中的单元数目或对象中的属性个数

    foreach-- 遍历数组

    list -- 遍历数组

    explode-- 将字符串转成数组
    implode-- 将数组转成一个新字符串
    array_merge-- 合并一个或多个数组
    is_array-- 检查是否是数组
    print_r -- 输出数组
    sort -- 数组排序
    array_keys-- 返回数组中所有的键名

    array_values-- 返回数组中所有的值
    key-- 从关联数组中取得键名

     

     16、字符串的常用函数

    trim()-- 去除字符串首尾处的空白字符(或者其他字符)

    strlen()-- 字符串长度
    substr()-- 截取字符串
    str_replace()-- 替换字符串函数

    substr_replace()-- 对指定字符串中的部分字符串进行替换 

    strstr()-- 检索字符串函数

    explode()-- 分割字符串函数

    implode()-- 将数组合并成字符串

    str_repeat()-- 重复一个字符串

    addslashes()-- 转义字符串

    htmlspecialchars()--THML 实体转义

     
    17、写一个函数,能够遍历一个文件夹下的所有文件和子文件夹
     

     

    18、以下代码的执行后是,$result 值为: 
    答案:false
    is_null-- 检测变量是否为NULL,
    如果变量是 null 则返回 TRUE,否则返回 FALSE。

    在下列情况下一个变量被认为是 NULL: 1) 被赋值为 NULL
    2) 尚未被赋值
    3) 被 unset()

    19、请列举出你所知道的全局环境变量

     $_ENV;

    $_SERVER;

    $_REQUEST

    $_FILES

    $_SESSION;

    $_COOKIE;

    $_GET;

    $_POST;
    $GLOBALS;
     
    20、session 与 cookie 的关系和区别?

    COOKIE保存在客户端,而SESSION则保存在服务器端

    从安全性来讲,SESSION的安全性更高

    从保存内容的类型的角度来讲,COOKIE只保存字符串(及能够自动转换成字符串)

    从保存内容的大小来看,COOKIE保存的内容是有限的,比较小,而SESSION基本上没有这个限制

    从性能的角度来讲,用SESSION的话,对服务器的压力会更大一些

    SEEION依赖于COOKIE,但如果禁用COOKIE,也可以通过url传递


     
    21、写出 php 的 public, protected, private 三种访问控制模式的区别
    public:公有,任何地方都可以访问

    protected: 继承,只能在本类或子类中访问,在其它地方不允许访问

    private: 私有,只能在本类中访问,在其他地方不允许访问

    22、请写出单例模式如何设计
    <?php
    namespace Test;
    
    class Database
    {
       //私有化内部实例化的对象
        private static $instance = null;
       //私有化构造方法,禁止外部实例化
        private function __construct(){}
        //私有化__clone,防止被克隆
        private function __clone(){}
        // 公有静态实例方法
        public static function getInstance(){
           if(!empty(self::$instance)){
               return self::$instance;
           }else{
               self::$instance=new Database();
               return self::$instance;
           }
        }
    }
    
    $obj1=Database::getInstance();
    $obj2=Database::getInstance();
    $obj3=Database::getInstance();
    var_dump($obj1,$obj2,$obj3);
    echo $obj1==$obj2?1:0;
    echo "<br>";
    echo $obj1==$obj3?1:0;

    有些类只需要实例化一次,像数据库连接类,实例化多次的话会浪费资源,这时候就会用到单例模式

    简单的来说是“三私一公”:

    构造方法私有化后就不能从外部实例化类了,但是怎么实例化呢?

    就要用到静态方法了,将其公有化,便可在外部实例化类了,

    在方法里判断对象是否为空,如果为空就实例化,存在就直接将它返回,这样便实现了只实例化一次了

    23、接口和抽象类的区别是什么?

    抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。 抽象类是通过关键字 abstract 来声明的。

    抽象类与普通类相似,都包含成员变量和成员方法,两者的区别 在于,抽象类中至少要包含一个抽象方法,

    抽象方法没有方法体,该方法天生就是要被子类重写的。 抽象方法的格式为:abstract function abstractMethod();

    接口是通过 interface 关键字来声明的,接口中的成员常量和方法都是 public 的,方法可以不写关键字 public, 接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。

    抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。 子类继承抽象类使用 extends,子类实现接口使用 implements。

     
    24、类中如何定义常量, 如何类中调用常量,如何在类外调用常量

    类中的常量也就是成员常量,常量就是不会改变的量,是一个恒 值。定义常量使用关键字 const,例如:const PI = 3.1415326;

    无论是类内还是类外,常量的访问和变量是不一样的,常量不需 要实例化对象,

    访问常量的格式都是类名加作用域操作符号(双冒号)来调用, 即:类名:: 类常量名。

     
    25、以下代码的执行结果是:
    echo class b something
    类 b 继承自类 a,两个类都定义了构造函数,由于二者名字相同,

    所以子类中的构造函数覆盖了父类的构造函数,要想子类对象实例化时也执行父类的构造函数,需要在子类构造函数中使用parent::__construct()来显示调用父类构造函数。

     
    26、sql 语句应该考虑哪些安全性? 
    防止 Sql 注入,对特殊字符进行转义、过滤或者使用预编译的 sql 语句绑定变量。

    最小权限原则,特别是不要用 root 账户,为不同的类型的动作或 者组建使用不同的账户。

    当 sql 运行出错时,不要把数据库返回的错误信息全部显示给用 户,以防止泄露服务器和数据库相关信息。

     
     27、如何用命令把 mysql 里的数据备份出来
    (1). 导出一张表 

    mysqldump -u 用户名 -p 密码 库名 表名 > 文件名(如 D:/a.sql)

    (2). 导出多张表

    mysqldump-u用户名-p密码 库名 表名1表名2表名3>文件名(如 D:/a.sql)

    (3). 导出所有表
    mysqldump -u 用户名 -p 密码 库名 > 文件名(如 D:/a.sql)

    (4). 导出一个库
    mysqldump -u 用户名 -p 密码 -B 库名 > 文件名(如 D:/a.sql)

    28、MySQL 数据库中的字段类型 varchar 和 char 的主要区别? 那种字段的查找效率要高,为什么?

    区别一,定长和变长
    char 表示定长,长度固定,varchar 表示变长,即长度可变 当所插入的字符串超出它们的长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误信息,如果是宽松模式,则会截取 然后插入。如果插入的字符串长度小于定义长度时,则会以不同的方 式来处理,如char(10) ,表示存储的是10个字符,无论你插入的 是多少,都是 10 个,如果少于 10 个,则用空格填满。而 varchar(10) , 小于 10 个的话,则插入多少个字符就存多少个。

    varchar 怎么知道所 存储字符串的长度呢?实际上,对于 varchar 字段来说,需要使用一 个(如果字符串长度小于 255)或两个字节(长度大于 255)来存储字符串的长度。

    区别之二,存储的容量不同
    对 char 来说,最多能存放的字符个数 255,和编码无关。
    而 varchar 呢,最多能存放 65,532 个字符。
    varchar 的最大有效长度由最大行大小和使用的字符集确定,整体最大长度是 65,532 字节,最大有效长度是 65532 字节,在 varchar 存字符串的时候,第一个字节是空的,不存任何的数据,然后还需要两个字节来存放字符串的长度。所以有效长度就是 65535 - 1 - 2= 65532 由字符集来确定,字符集分单字节和多字节

    Latin1 一个字符占一个字节,最多能存放 65532 个字符
    GBK 一个字符占两个字节, 最多能存 32766 个字符
    UTF8 一个字符占三个字节, 最多能存 21844 个字符 注意,char 和 varchar 后面的长度表示的是字符的个数,而不是字节数。

    两相比较,char 的效率高,没有碎片,尤其更新比较频繁的时候,方便数据文件指针的操作。但不够灵活,在实际使用时,应根据实际需求来选用合适的数据类型。

    29、IP 该如何存储?

    最简单的办法是使用字符串(varchar)来保存,如果从效率考虑 的话,可以将 ip 保存为整型(unsignedint) ,使用 php 或 mysql 提供的函数将 ip 转换为整型,然后存储即可。

    PHP 函数:long2ip()和 ip2long()

    MySQL 函数:inet_aton()和 inet_ntoa

    30、请简述项目中优化 sql 语句执行效率的方法,从哪些方面,sql语句性能如何分析?

    1) 尽量选择较小的列
    2) 将where中用的比较频繁的字段建立索引
    3) select 子句中避免使用‘*’
    4) 避免在索引列上使用计算、not in 和<>等操作 5) 当只需要一行数据的时候使用limit1
    5) 保证单表数据不超过200W,适时分割表。

    6)选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段 设置 not null 例如'省份,性别',最好设置为 enum

    针对查询较慢的语句,可以使用explain 来分析该语句具体的执 行情况。

    31、今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一; 百钱买鸡百只,问鸡翁,母,雏个几何?

    题目大意:公鸡 5 文钱一只,母鸡 3 文钱一只,小鸡 1 文钱 3 只, 现在用 100 文钱共买了 100 只鸡,

    问:在这 100 只鸡中,公鸡,母鸡和小鸡是多少只?(设每种至少一只)

     
     32、
    打印九九乘法表

     

    33、写程序冒泡排序(数组排序)
    内层每循环一次,较大的数会往后挪一位
    外层每循环一次,最大的数会排到最后面
    $order_array=array(
    5,4,3,6,7,1,2,10,8,9
    );
    function bubble_order($arr){
        //得到长度
        $count_num=count($arr);
    
        for($k=1;$k<$count_num;$k++){
    
            //对长度越来越少的一组数据 找出最大让其浮到最后
    
            for($i=0;$i<$count_num-$k;$i++){
    
                if($arr[$i]>$arr[$i+1]){//相邻比较
                    $tem=$arr[$i];
                    $arr[$i]=$arr[$i+1];
                    $arr[$i+1]=$tem;
                }
    
            }
        }
        return $arr;
    }
    $new_order_arr=bubble_order($order_array);
      34、HTTP 响应状态码常见的有那些,代表什么意思
    响应状态码: 
    常见状态码

     

     35、简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别

    区别主要有以下几个:

    构成上,MyISAM 的表在磁盘中有三个文件组成,分别是表定义文 件(.frm) 、数据文件(.MYD) 、索引文件(.MYI),而 InnoDB 的 表由表定义文件(.frm)、表空间数据和日志文件组成。

    安全方面,MyISAM 强调的是性能,其查询效率较高,但不支持事 务和外键等安全性方面的功能,而 InnoDB 支持事务和外键等高级功 能,查询效率稍低。

     
     
    36、反转数组函数的实现
    /**
     * 反转数组
     * @param  array $arr 
     * @return array
     */
    function reverse($arr)
    {
        $n = count($arr);
    
        $left = 0;
        $right = $n - 1;
    
        while ($left < $right) {
            $temp = $arr[$left];
            $arr[$left++] = $arr[$right];
            $arr[$right--] = $temp;
        }
    
        return $arr;
    }

    37、打乱数组

    /**
     * 打乱数组
     * @param  array $arr 
     * @return array      
     */
    function custom_shuffle($arr)
    {
        $n = count($arr);
        for ($i = 0; $i < $n; $i++) {
            $rand_pos = mt_rand(0, $n - 1);
            if ($rand_pos != $i) {
                $temp = $arr[$i];
                $arr[$i] = $arr[$rand_pos];
                $arr[$rand_pos] = $temp;
            }
        }
        return $arr;
    }
    38、Memcache与Redis的区别

    Memcache

    1. 该产品本身特别是数据在内存里边的存储,如果服务器突然断电,则全部数据就会丢失
    2. 单个key(变量)存放的数据有1M的限制
    3. 存储数据的类型都是String字符串类型
    4. 本身没有持久化功能
    5. 可以使用多核(多线程)

    Redis

    1. 数据类型比较丰富:String、List、Set、Sortedset、Hash
    2. 有持久化功能,可以把数据随时存储在磁盘上
    3. 本身有一定的计算功能
    4. 单个key(变量)存放的数据有1GB的限制

     

     39、最左前缀原则
     有一个复合索引:INDEX(`a`, `b`, `c`)
     
    使用方式能否用上索引
    select * from users where a = 1 and b = 2 能用上a、b
    select * from users where b = 2 and a = 1 能用上a、b(有MySQL查询优化器)
    select * from users where a = 2 and c = 1 能用上a
    select * from users where b = 2 and c = 1 不能
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Advanced Configuration Tricks
    Reviewing the Blog Module
    Editing and Deleting Data
    Making Use of Forms and Fieldsets
    Understanding the Router
    SQL Abstraction and Object Hydration
    Preparing for Different Databases
    Java学习理解路线图
    Openstack学习历程_1_视频
    CentOS安装Nginx负载
  • 原文地址:https://www.cnblogs.com/lamp01/p/8486451.html
Copyright © 2011-2022 走看看