PHP 面试踩过的坑(二)「建议收藏」

PHP 面试踩过的坑(二)

大家好,又见面了,我是全栈君。

11. 常见的排序算法

1. 冒泡排序
思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。


代码实现:
$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function bubbleSort($arr)
{  
  $len=count($arr);
  //该层循环控制 需要冒泡的轮数
  for($i=1;$i<$len;$i++)
  { //该层循环用来控制每轮 冒出一个数 需要比较的次数
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}


2. 选择排序 
思路分析:在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。


代码实现:
function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假设最小的值的位置
        $p = $i;




        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 是当前已知的最小值
            if($arr[$p] > $arr[$j]) {
            //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
                $p = $j;
            }
        }
        //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
}


3.插入排序
思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。


代码实现:
function insertSort($arr) {
    $len=count($arr); 
    for($i=1, $i<$len; $i++) {
        $tmp = $arr[$i];
        //内层循环控制,比较并插入
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    return $arr;
}
4.快速排序  
思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
代码实现:
function quickSort($arr) {
    //先判断是否需要继续进行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //选择第一个元素作为基准
    $base_num = $arr[0];
    //遍历除了标尺外的所有元素,按照大小关系放入两个数组内
    //初始化两个数组
    $left_array = array();  //小于基准的
    $right_array = array();  //大于基准的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边
            $right_array[] = $arr[$i];
        }
    }
    //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合并
    return array_merge($left_array, array($base_num), $right_array);
}
原文:https://www.cnblogs.com/rainblack/p/5808694.html

12. 接口与抽象类的区别

1. 接口
(1)对接口的使用是通过关键字implements
(2)接口不能定义成员变量(包括类静态变量),能定义常量
(3)子类必须实现接口定义的所有方法
(4)接口只能定义不能实现该方法
(5)接口没有构造函数
(6)接口中的方法和实现它的类默认都是public类型的
2. 抽象类
(1)对抽象类的使用是通过关键字extends
(2)不能被实例化,可以定义子类必须实现的方法
(3)子类必须定义父类中的所有抽象方法,这些方法的访问控制必须和父类中一样(或者更为宽松)
(4)如一个类中有一个抽象方法,则该类必须定义为抽象类
(5)抽象类可以有构造函数
(6)抽象类中的方法可以使用private,protected,public来修饰。
(7)一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。
3. Final类/方法
(1)final类不能被继承
(2)final方法不能被重写
4. Static类/方法
(1)可以不实例化类而直接访问
(2)静态属性不可以由对象通过->操作符来访问,用::方式调用
原文:http://www.php.cn/php-weizijiaocheng-372186.html

13.innoDB,MyISAM 的区别

MyISAM:
不支持事务;
数据存储在磁盘,可被压缩,存储空间较小;
只支持表级锁;
支持(FULLTEXT类型的)全文索引。
保存有表的总行数,如果select count(*) from table,会直接取出该值;
如果执行大量的SELECT,MyISAM是更好的选择;
不支持外键;


InnoDB:
支持事务;
存储在共享空间,需要更多的内存和存储;
具有事务、回滚和崩溃修复能力;
只支持行级锁;
不支持(FULLTEXT类型的)全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好;
支持外键;
如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。


**MyISAM和InnoDB两者的应用场景:**\
1) MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。\
2) InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
原文:https://www.cnblogs.com/kevingrace/p/5685355.html

14. 常见的设计模式

#策略模式
策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用。
策略模式指的是程序中涉及决策控制的一种模式。策略模式功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性思想。
策略模式的三个角色:
1.抽象策略角色
2.具体策略角色
3.环境角色(对抽象策略角色的引用)
实现步骤:
1.定义抽象角色类(定义好各个实现的共同抽象方法)
2.定义具体策略类(具体实现父类的共同方法)
3.定义环境角色类(私有化申明抽象角色变量,重载构造方法,执行抽象方法)
就在编程领域之外,有许多例子是关于策略模式的。例如:
如果我需要在早晨从家里出发去上班,我可以有几个策略考虑:我可以乘坐地铁,乘坐公交车,走路或其它的途径。每个策略可以得到相同的结果,但是使用了不同的资源。


# 工厂模式
工厂模式是我们最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。
使用工厂模式的好处是,如果你想要更改所实例化的类名等,则只需更改该工厂方法内容即可,不需逐一寻找代码中具体实例化的地方(new处)修改了。为系统结构提供灵活的动态扩展机制,减少了耦合。


# 单例模式
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡的驱动程序常被设计成单例。
单例模式分3种:懒汉式单例、饿汉式单例、登记式单例。
单例模式有以下3个特点:
1.只能有一个实例。
2.必须自行创建这个实例。
3.必须给其他对象提供这一实例。
那么为什么要使用PHP单例模式?
PHP一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。
# 注册模式
注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。
# 适配器模式
将各种截然不同的函数接口封装成统一的API。\
PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。\
首先定义一个接口(有几个方法,以及相应的参数)。然后,有几种不同的情况,就写几个类实现该接口。将完成相似功能的函数,统一成一致的方法。
原文:https://www.cnblogs.com/leedaily/p/8250158.html

15. 写出乘法表的算法

1.九九乘法表 for 实现:
for($i=1;$i<10;$i++){    
    for($j=1;$j<=$i;$j++){        
    echo $i.'*'.$j.'='.$i*$j.'   ';   
    }    
    echo '<br />';
}
2.九九乘法表 while 实现:
$m = 1;
while($m<10){    
    $n = 1;   
    while($n<=$m){       
    echo $m.'*'.$n.'='.$m*$n.'   ';        
    $n++;       
}       
echo '<br>';        
$m++;}
原文:https://blog.csdn.net/hahahahahahahaha__1/article/details/80665491

16.echo,print_r ,print,var_dump 区别

 echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)
 print() 只能打印出简单类型变量的值(如int,string)
 print_r() 可以打印出复杂类型变量的值(如数组,对象)
 echo 输出一个或者多个字符串
 echo:语句结构;
 print:是函数,有返回值
 print_r:能打印数组,对象
 var_dump:能打印对象数组,并且带数据类型

17.session 和 cookie 的区别

 session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
 cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
两者都可通过时间来设置时间长短

18. 用 PHP 写出显示客户端 IP 与服务器 IP 的代码

客户端:$_SERVER["REMOTE_ADDR"]
服务器:$_SERVER["SERVER_ADDR"]

19.sql 语句应该考虑哪些安全性

(1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译sql语句绑定
(2)使用最小权限原则,特别是不要使用root账户,为不同的动作或者操作建立不同的账户
(3)当sql出错时,不要把数据库出错的信息暴露到客户端

20. 优化 mysqi 数据库的方法

(1)选取适当的字段,打字段设置为NOT NULL,在查询的时候数据库不用比较NULL;
(2)使用链接(join)代替子查询;
(3)使用联合(UNION)查询代替手动创建临时表;
(4)尽量减少使用(LIKE)关键字和通配符
(5)使用事务和外健

21. 对于大流量的网站,你会采用什么方法来解决访问量?

(1)首先确认服务器硬件是否满足支持当前的流量;
(2)优化数据库的访问;
(3)禁止外部盗链;
(4)控制大文件下载;
(5)使用不同的主机分流;
(6)使用流量分析统计;

PHP 面试踩过的坑(二)「建议收藏」

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111869.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Ext.Panel的主要功能

    Ext.Panel的主要功能

    2021年11月30日
  • pytest的使用_java中方法的调用

    pytest的使用_java中方法的调用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

  • Ant 执行 YUICompressor

    Ant 执行 YUICompressorAnt执行YUICompressor任务压缩JavaScript和CSS文件,解决中文乱码问题,增加源文件字符编码集设定标签:javascriptantcss任务encodingnull2012-04-0510:465376人阅读评论(4)收藏举报分类:Java(14)Ant版权声明:本文为博主原创文章,未经博主允许…

  • voliate理解

    voliate理解voliatevoliate定义java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM…

  • Typora的最后一个免费版本MD编辑器「建议收藏」

    Typora的最后一个免费版本MD编辑器「建议收藏」title:Typora的最后一个免费版本date:2022-05-1116:39:04tags:MDcategories:软件废话不多说,直接来我的仓库下载就可以了。利用Typora把图片添加到Hexo博客中安装插件。$npminstallhexo-renderer-marked–save2.再修改一下配置文件_config.yml,加入下面的配置。marked:prependRoot:truepostAsset:true3.在“Blog->s

  • apk反编译后smali文件_apk反编译失败

    apk反编译后smali文件_apk反编译失败APK反编译之一:基础知识原文作者:lpohvbe| http://blog.csdn.net/lpohvbe/article/details/7981386APK、Dalvik字节码和smali文件APK文件  大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号