PHP面试汇总基础(一)

    技术2025-08-22  9

    文章转载在自有微信公众平台“码农快讯”

    阅读原文(码农快讯)

    1.什么是面向对象,有何特征?

    说到面向对象,不得不说之前的面向过程开发,面向过程是“自上而下”的开发,先写好主体,然后再添砖加瓦,同时在软件系统越来越复杂的情况下,面向过程开发缺点逐渐突出:难以复用,不易维护、不易扩展。

    面向对象是“自下而上”的开发过程,思想是现实中所有事物都可以抽象为程序设计中的“对象”,先设计组件,再完成组装。

    显然,面向对象可以使得设计出的程序:

    易维护、易复用、易扩展。

    由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护 。

     

    2.Session和Cookie区别是什么?

    首先,在理解Session和Cookie之前,我们要知道Http协议,它是一种无状态协议,在数据传输过程中,并无法识别标记用户。那么,我们想要登录状态保持,用户喜好记录,该怎么做呢?

    这时候,推出了Session和Cookie机制。那么它们有什么不同吗?

    A.存储位置:Session存储于服务端,Cookie存储于客户端(浏览器)

    B.生命周期:默认Session在用户关闭客户端即会失效,而Cookie可根据浏览器自身设置,可永久保存,比如记住密码功能。

    C.跨域支持:默认Cookie是支持跨域访问的,Session则不支持跨域访问。

    D.机制不同:Session通过sessionId存取服务器的session数据,sessionId存储于Cookie中,一般来说,禁用客户端Cookie,Session同样不可使用,但是,可以通过技术来解决。

    E.安全性:Cookie是客户端存储,一种简单易得的存储方式,安全性较差,session数据存储于服务端,较安全。

     

    3.HTTP状态中的302、403、500代码含义?

    HTTP状态码中1:消息代码;2:成功代码;3:重定向代码;4:请求错误代码;5:服务端错误代码;

    302:临时转移成功

    403:禁止访问

    500:服务器内部错误

     

    4.MYSQL中MyISAM及InnoDB区别?

    ①InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

    ②InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;

    ③InnoDB 是聚集索引,MyISAM 是非聚集索引。

    ④InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

    ⑤InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。

     

    实际应用中该如何选择:

    ①如果需要事务,选择InnoDB

    ②如果大量的读取操作,选择MyISAM

    ③Mysql 5.5版本开始,默认使用InnoDB,如果不知道如何选择,直接使用InnoDB即可。

     

    5.实现冒泡排序及快速排序

    // 冒泡排序 // 实现思路:每次从数组里面选出一个最大值,一直递归 // 它的最优时间复杂度为O(n)【正序,数组排好情况下】, // 最糟糕时间复杂度为O(n^2)【反序:数组排序刚好相反】 function sort($arr) { for ($i = 0; $i < count($arr); $i++) { for ($j = $i + 1; $j < count($arr); $j++) { if ($arr[$i] > $arr[$j]){ $tem = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $tem; } } } } // 快速排序 // 实现思路:把第一个元素作为标记,依次判断后续的值, // 如果小于它则放在左边,如果大于它则放右边, // 同理把左右两部分看成一个整体一直递归,最后再数组拼接起来 // 它的最优时间复杂度为O(nlogn)【以标记元素为中心,正好每次左右都能均 // 匀分配】,最糟糕时间复杂度为O(n^2)【标记元素每次是最大或最小值, // 使所有数都划分到一边】 function quick_sort($array) { if (count($array) <= 1) return $array; $key = $array[0]; $left_arr = array(); $right_arr = array(); for ($i = 1; $i < count($array); $i++) { if ($array[$i] <= $key) $left_arr[] = $array[$i]; else $right_arr[] = $array[$i]; } $left_arr = $this->quick_sort($left_arr); $right_arr = $this->quick_sort($right_arr); return array_merge($left_arr, array($key), $right_arr); }

    6.PHP读取文件内容常用的方法及函数

    1.string fread ( int $handle , int $length ) <?php $filename = "something.txt"; $handle = fopen($filename, "r"); $contents = fread($handle, filesize ($filename)); fclose($handle); ?> 2.string fgets ( int $handle [, int $length ] ) <?php $handle = fopen('./file.txt', 'r'); while(!feof($handle)){ echo fgets($handle, 1024); } fclose($handle); ?> 3.string fgetss (resource $handle [, int $length [, string $allowable_tags ]] ) <?php $handle = fopen('./file.txt', 'r'); while(!feof($handle)){ echo fgetss($handle, 1024, '<br>'); } fclose($handle); ?> 4.array file ( string $filename [, int $use_include_path [, resource $context ]] ) <?php $a = file('./file.txt'); foreach($a as $line => $content){ echo 'line '.($line + 1).':'.$content; } ?> 5.int readfile ( string $filename [, bool $use_include_path [, resource $context ]] ) <?php $size = readfile('./file.txt'); echo $size; ?> 6.string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] ) <?php $ctx = stream_context_create( array( 'http' => array( 'timeout' => 1 //设置超时 ) ) ); echo file_get_contents("http://www.baidu.com/", 0, $ctx); ?> 7.int fpassthru ( resource $handle ) <?php header("Content-Type:text/html;charset=utf-8"); $handle = fopen('./test2.php', 'r'); fseek($handle, 1024);//将指针定位到1024字节处 fpassthru($handle); ?>

    7.表单提交中的Get和Post区别?

    ①get是从服务器上获取数据,post是向服务器传送数据。

    ②get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。

    ③对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。

    ④get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。

    ⑤get安全性非常低,post安全性较高。

    8.写几个魔术方法,并说明其作用

    __call()当调用不存在的方法时会自动调用的方法 __autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件 __set()当给未定义的变量赋值时会自动调用的方法 __get()当获取未定义变量的值时会自动调用的方法 __construct()构造方法,实例化类时自动调用的方法 __destroy()销毁对象时自动调用的方法 __unset()当对一个未定义变量调用unset()时自动调用的方法 __isset()当对一个未定义变量调用isset()方法时自动调用的方法 __clone()克隆一个对象 __tostring()当输出一个对象时自动调用的方法

    9.写几个PHP中的预定义变量,并做描述?

    $REQUEST用来获取post或get方式提交的值 $_POST用来获取post方式提交的值 $_GET用来获取get方式提交的值 $_COOKIE用来获取cookie存储的值 $_SESSION用来获取session存储的值 $_FILES用来获取上传文件表单的值

    10.include与require区别?

    两个包含的_once都只是引入一次

    最主要的区别在于:require在出错时,产生E_COMPLIE_ERROR级别错误,并终止程序运行。include再出错时产生E_WARNING,程序会继续运行。

    require是无条件包含,无论条件是否成立,都会首先执行require,所以require通常放在程序的开头。

     

    11.PHP传值与传引用区别,什么时候用传引用?

    按值传递:函数范围内,对于值的任何改变再函数外部都会被忽略

    按引用传递:函数范围内,对于变量的改变,都会在外部体现

    在PHP中,按值传递,都会对要操作的值进行先进行复制,再进行操作,对于大型的串或者对象来说,这将是一个代价很大的操作,而传引用则不需要对值进行复制。

     

    12.PHP单引号与双引号区别?

    ①单引号中,包含的变量不会执行,双引号会执行

    ②单引号解析速度快于双引号(双引号需要经过编译解析)

     

    13.PHP中常见的安全防护有哪些?

    ①SQL注入:mysql_real_escape_string()过滤数据

    ②XSS攻击:htmlentities()函数过滤再输出到浏览器

    ③CSRF攻击:生成一个一次性令牌嵌入表单,一同提交验证

    ④过滤用户输入:

    php.ini中设置禁用allow_url_fopen和allow_url_include

     

    14.PHP如何解决大流量与高并发?

    ①硬件方面:网络-硬盘读写速度-内存大小-cpu处理速度

    ②静态化:静态页面代替动态页面

    ③资源分离:图片、音频等文件,分离出单独的文件服务器,也可以使用CDN,减少主服务器请求量。

    ④负载均衡:增加服务器单位时间内处理量

    ⑤数据库优化:SQL优化,使用查询缓存,分库分表

    ⑥控制大文件下载

    ⑦防止外部盗链,简单的设置referer,Nninx/Apache内设置禁止访问

     

    15.优化Mysql数据库的常用方法?

    1.选择最有效率的表名顺序 2.WHERE子句中的连接顺序 3.SELECT子句中避免使用‘*’ 4.用Where子句替换HAVING子句 5.通过内部函数提高SQL效率 6.避免在索引列上使用计算。 7.提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。 8.选取最适用的字段属性,应该尽量把字段设置为NOT NULL 9.使用连接(JOIN)来代替子查询(Sub-Queries) 10.使用联合(UNION)来代替手动创建的临时表 11.尽量少使用 LIKE 关键字和通配符 12.使用事务和外键

    16.Mysql读写分离如何实现?

    读写分离的实现原理就是在执行SQL语句的时候,判断到底是读操作还是写操作,把读的操作转向到读服务器上(从服务器,一般是多台),写的操作转到写的服务器上。

    需要用到数据库的主从配置,主从复制的原理实际是多台服务器都开启bin日志,然后主服务器会把执行过的sql语句记录到bin日志中,之后从服务器读取这个bin日志,把该日志的内容保存到自己中继日志里面,从服务器再把中继日志中记录的sql语句同样的执行一遍。这样从服务器上的数据就和主服务器相同了。

     

    17.redis与memcache区别?

    ①类型:Redis支持内存、非关系数据库;Memcached支持内存、key-value键值对、缓存系统。

    ②数据存储类型:Redis支持String、List、Set、Hash等,Memcached仅支持文本、二进制类型。

    ③查询操作类型:Redis支持批量操作、事务每个类型有不同的CRUD,Memcached支持CRUD及少量的其他命令

    ④网络IO模型:Redis单进程模式,Memcached支持多线程

    ⑤持久化:Redis支持持久化,RDB、AOF,Memcached不支持持久化

    阅读原文(码农快讯)

    最新的技术文章第一时间发布在我们自有的微信公众平台“码农快讯”

    扫码关注我们

    Processed: 0.011, SQL: 9