php面试宝典

本文详细介绍了PHP编程中的一些核心概念,包括Include和Require的区别、面向对象的三大特性、PHP的垃圾回收机制、Session与Cookie的区别、PDO、adoDB、PHPLib数据库抽象层的比较、设计模式概述以及PHP的基础算法。此外,还讨论了HTTP协议、MySQL数据库类型、索引优化技巧以及PHP的编码风格规范。文章最后提到了日志记录器的PSR-3规范和PSR-4自动加载器的实现。
摘要由CSDN通过智能技术生成

Include和require的区别

区别一

Include引入文件的时候,如果碰到错误,会给出提示,并继续运行下边的代码。

Require引入文件的时候,如果碰到错误,会给出提示,并停止运行下边的代码。

区别二

用法上却有一些不同,include是有条件包含函数,而require则是无条件包含函数

Include 是比较松一点的‘包含’,如:文件不存在也不会出现什么问题,程序还可以往下执行。

Require是比较严格‘包含’,如:文件不存在或无权限访问时,程勋马上抛出错并终止。

PHP面向对象——三大基本特性与五大基本原则

三大特性是:封装、继承、多态

封装 把成员方法和成员属性封装到类中

多态是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果

五大基本原则

1.单一职责原则SRP(Single Responsibility Principle)

是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

2.开放封闭原则OCP(Open-Close Principle)

一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,

那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

3.替换原则(the Liskov Substitution Principle LSP)

子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,

也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

 

4.依赖原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。

假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

 

5.接口分离原则(the Interface Segregation Principle ISP)

模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来

 

php的垃圾回收机制

PHP可以自动进行内存管理,清除不需要的对象。
PHP使用了引用计数(reference counting) GC机制。
每个对象都内含一个引用计数器refcount,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

 

Session和cookie的区别

  1. cookie是一文本文件格式存储在浏览器中,而session存储在服务端。它存储限制数据量。它只允许4kb。它没有在cookie中保存多个变量。
  2. cookie的存储限制了数据量,只允许4kb,而session是无限量的
  3. 我们可以轻松访问cookie值但是我们无法轻松访问session值,因此session更安全
  4. 设置cookie时间可以使cookie过期。但是使用session-destory,我们将会销毁会话。

 

为什么禁用cookie就不能得到session呢

因为session是用sessionID来确定当前对话所对应的服务器session,而session ID是用过cookie来传递的,禁用cookie相当于失去了sessionID,也就得不到session了。

 

如何修改SESSION的生存时间
1. 设置浏览器保存的sessionid失效时间 setcookie(session_name(), session_id(), time() + $lifeTime, "/");
2. 可以使用SESSION 自带的 session_set_cookie_params(86400); 来设置 Session 的生存期
3. 通过修改php.ini中的session.gc_maxlifetime参数的值就可以改变session的生存时间

 

PDO、adoDB、PHPLib数据库抽象层比较
PHP数据库抽象层就是指,封装了数据库底层操作的介于PHP逻辑程序代码和数据库之间的中间件。
PDO以PHP 5.1为基础进行设计,它使用C语言做底层开发,设计沿承PHP的特点,以简洁易用为准,从严格意义上讲,PDO应该归为PHP 5的SPL库之一,而不应该归于数据抽象层,因为其本身和MySQL和MySQLi扩展库的功能类似。PDO是不适合用在打算或者有可能会变更数据库的系 统中的。

ADODB不管后端数据库如何,存取数据库的方式都是一致的;

转移数据库平台时,程序代码也不必做太大的更动,事实上只需要改动数据库配置文 件。提供了大量的拼装方法,目的就是针对不同的数据库在抽象层的底层对这些语句进行针对性的翻译,以适应不同的数据库方言!但是这个抽象层似乎体积过于庞 大了,全部文件大概有500K左右,如果你做一个很小的网站的话,用这个似乎大材小用了

PHPLib可能是伴随PHP一同成长最老的数据库抽象层(但和ADODB相比,它只算是一个MySQL抽象类库),这个抽象类使用方法相当简单,体积小,是小型网站开发不错的选择。

PDO提供预处理语句查询、错误异常处理、灵活取得查询结果(返回数组、字符串、对象、回调函数)、字符过滤防止SQL攻击、事务处理、存储过程。

ADODB支持 缓存查询、移动记录集、(HTML、分页、选择菜单生成)、事务处理、输出到文件。

 

设计模式

创建型:单例模式、工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式

结构型:适配器、桥接、过滤器、组合、装饰、外观、享元、代理

行为型:责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、空对象

J2EE型:mvc、业务代表、组合实体、数据访问对象、前端控制器、拦截过滤器、服务定位器、传输对象

单例模式 三私一公 私有构造方法、私有属性、私有函数、公共函数常用于连接mysql数据库 防止外部实例化盗链 只能实例化一次

工厂模式 高内聚低耦合  工厂类调用自身静态方法来生成对象实例

 

Php四种基础算法

分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序。

$arr(1,43,54,62,21,66,32,78,36,76,39);

 

1. 冒泡排序法

 *     思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来。

 *     比如:2,4,1    // 第一次 冒出的泡是4

 *                2,1,4   // 第二次 冒出的泡是 2

 *                1,2,4   // 最后就变成这样

$arr=array(1,43,54,62,21,66,32,78,36,76,39);  

function getpao($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 select_sort($arr) {

//实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数

    //$i 当前最小值的位置, 需要参与比较的元素

    for($i=0, $len=count($arr); $i<$len-1; $i++) {

        //先假设最小的值的位置

        $p = $i;

        //$j 当前都需要和哪些元素比较,$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.插入排序法

插入排序法思路:将要排序的元素插入到已经 假定排序号的数组的指定位置。

function insert_sort($arr) {

    //区分 哪部分是已经排序好的

    //哪部分是没有排序的

    //找到其中一个需要排序的元素

    //这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素

    //利用循环就可以标志出来

    //i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,

    //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列

    for($i=1, $len=count($arr); $i<$len; $i++) {

        //获得当前需要比较的元素值。

        $tmp = $arr[$i];

        //内层循环控制 比较 并 插入

        for($j=$i-1;$j>=0;$j--) {

   //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素

            if($tmp < $arr[$j]) {

                //发现插入的元素要小,交换位置

                //将后边的元素与前面的元素互换

                $arr[$j+1] = $arr[$j];

                //将前面的数设置为 当前需要交换的数

                $arr[$j] = $tmp;

            } else {

                //如果碰到不需要移动的元素

           //由于是已经排序好是数组,则前面的就不需要再次比较了。

                break;

            }

        }

    }

    //将这个元素 插入到已经排序好的序列内。

    //返回

    return $arr;

}

 

4.快速排序法  

function quick_sort($arr) {

    //先判断是否需要继续进行

    $length = count($arr);

    if($length <= 1) {

        return $arr;

    }

    //如果没有返回,说明数组内的元素个数 多余1个,需要排序

    //选择一个标尺

    //选择第一个元素

    $base_num = $arr[0];

    //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内

    //初始化两个数组

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值