PHP面试笔试宝典

来自《PHP程序员面试笔试宝典》,涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书。

PHP题目

一、单例模式是在应用程序中最多只能拥有一个该类的实例存在,一旦创建就会一直在内存中。

由于单例模式的设定,所以常应用于数据库类设计,它可以保证只连接一次数据库。

单例类的特点如下:

1)单例类不能直接实例化创建,只能由类本身实例化。因此,构造函数必须标记为private,从而防止类被实例化。

2)需要保证一个能访问到的实例公开的静态方法和一个私有静态成员变量来保存类实例。

3)类中通常需要有一个空的私有__clone()方法防止别人对单例类进行实例克隆。

示例代码如下:

<?php

class Database

{

private static $instance;

private function __construct()

{

// to do

}

private function __clone()

{

// to do

}

public static function getInstance()

{

if (!(self::$instance instanceof self)) {

self::$instance = new self();

}

return self::$instance;

}

}

$a =Database::getInstance();

$b =Database::getInstance();

print_r($a === $b);

?>

二、【真题180】 写一个函数尽可能高效地从一个标准 url 里取出文件的扩展名。例如http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php 或 .php。

参考答案:方法

function getExt($url){

$arr = parse_url($url);

$file = basename($arr['path']);

$ext = explode(".",$file);

return $ext[1];

}

方法

function getExt($url) {

$url = basename($url);

$pos1 = strpos($url,".");

$pos2 = strpos($url,"?");

if(strstr($url,"?")){

return substr($url,$pos1 + 1,$pos2 - $pos1 - 1);

}else{

return substr($url,$pos1);

}

}

三、1PHP相关的日期函数

1)checkdate($month,$date,$year)函数的功能是在日期用于计算或被保存在数据库中之前,判断日期是否是一个合法的日期。如下例所示:

<?php

echo checkdate(2,30,2005) ? "valid" : "invalid";    //输出invalid

echo checkdate(4,6,2010) ? "valid" : "invalid";     //输出valid

?>

如果日期有效,则输出valid,如果日期无效,则输出invalid。

2)mktime($hour, $minute, $second, $month, $day, $year)函数的功能是获得即时时间的UNIX时间戳。示例代码如下:

<?php

// returns timestamp for 2017-11-25 13:15:23

echo mktime(13,15,23,11,25,2017);    //输出1511586923

?>

mktime可以根据实际返回unix时间戳。

3)date($format, $ts)函数的功能是显示格式化时间或日期。示例代码如下:

<?php

echo date("d-M-Y h:i A", mktime()); //输出13-Sep-2005 01:16 PM

?>

4)strtotime($str)函数的功能是将非标准化的日期/时间字符串转换成标准、兼容的UNIX时间戳。示例代码如下:

<?php

echo date("d-M-y", strtotime("today"));    //输出25-Nov-17

echo date("d-M-y", strtotime("tomorrow")); //输出26-Nov-17

echo date("d-M-y", strtotime("today +3 days"));   //输出28-Nov-17

?>

strtotime("today")获取的是今天的时间戳,strtotime("tomorrow")获取的是明天时间的时间戳,strtotime("today +3 days")获取到的是三天后的时间戳。

四、【真题173】 在如下代码中,date()将会输出(    )。

<?php

$date="2009-5-19";

$time="14:31:38";

$datetime=$date.$time;

echo date("Y-m-d:H:i:s",strtotime($datetime));

?>

A.2009-05-19:14:31:38 B.19-5-2009:2:31:38

C.2009-5-19:2:31:38 D.19/5/2009:14:31:38

参考答案:A。

分析:日期中输出的H:i:s中的H表示24小时制的小时,i表示分,s表示秒。所以根据拼接的时间通过strtotime()函数转换成时间戳后再转成日期就可以得到2009-05-19:14:31:38。所以,选项A正确。

 

【真题181】 写一个函数,算出两个文件的相对路径。例如,$a = \/a/b/c/d/e.php\;,$b =  \/a/b/12/ 34/c.php\;,计算出 $b 相对于 $a 的相对路径应该是 ../../c/d。

参考答案:示例代码如下:

function getRelativepath($a, $b) {

$returnpath = array(dirname($b));

$arrA = explode(' \/\ ', $a);

$arrB = explode(' \/\ ', $returnpath[0]);

for ($n = 1, $len = count($arrB); $n < $len; $n++) {

if ($arrA[$n] != $arrB[$n]) {

break;

}

}

if ($len - $n > 0) {

$returnpath = array_merge($returnpath, array_fill(1, $len - $n, "\..\ "));

}

$returnpath = array_merge($returnpath, array_slice($arrA, $n));

return implode(' \/\ ', $returnpath);

}

$a = "\/a/b/c/d/e.php\";

$b = "\/a/b/12/34/c.php\";

echo getRelativepath($a, $b);

【真题182】 以下关于PHP文件处理的说法中,正确的是(    )。

A.filegetcontents()函数能用来抓取网页数据,但是没办法设置超时时间

B.file()函数既能读取文本文件也能读取二进制文件,但是读取二进制文件有可能出现安全问题

C.如果表单中没有选择上传的文件,则 PHP 变量的值将为NULL

D.fsockopen()和fputs()结合起来可以发送邮件,也可以用来抓取网页内容、下载ftp文件等

参考答案:C。

分析:对于选项A,可以通过context参数设置超时时间。所以,选项A错误。

对于选项B,file()函数是可以安全用于读取二进制文件的。所以,选项B错误。

对于选项C,表单中没有文件上传时,PHP的$_FILES变量值为NULL。所以,选项C正确。

对于选项D,fputs()用于写入字符串到文件中,只能用于上传不能用于下载ftp文件。所以,选项D错误。

Mysql题目

一、如何进行数据库优化?

数据库优化的过程可以使用以下的方法进行:

1)选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份、性别',最好设置为ENUM。

2)使用连接(JOIN)来代替子查询。

① 删除没有任何订单客户:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)。

② 提取所有没有订单客户:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)。

③ 提高b的速度优化:SELECT FROM customerinfo LEFT JOIN orderid customerinfo. customerid=orderinfo.customerid WHERE orderinfo.customerid IS NULL。

3)使用联合(UNION)来代替手动创建的临时表。创建临时表:SELECT name FROM 'nametest' UNION SELECT username FROM 'nametest2'。

4)事务处理。保证数据完整性,例如添加和修改。同时,如果两者成立,则都执行,一者失败都失败:

mysql_query("BEGIN");

mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";

mysql_query("SELECT * FROM 'orderinfo' where customerid=".$id");

mysql_query("COMMIT");

5)锁定表,优化事务处理。用一个SELECT语句取出初始数据,通过一些计算,用UPDATE语句将新值更新到表中。包含有WRITE关键字的LOCK TABLE语句可以保证在UNLOCK TABLES命令被执行之前,不会有其他的访问来对customerinfo表进行插入、更新或者删除的操作。

mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");

mysql_query("SELECT customerid FROM 'customerinfo' where id=".$id);

mysql_query("UPDATE 'orderinfo' SET ordertitle='$title' where customerid=".$id);

mysql_query("UNLOCK TABLES");

6)使用外键,优化锁定表。把customerinfo里的customerid映射到orderinfo里的customerid,任何一条没有合法的customerid的记录不会写到orderinfo里。

CREATE TABLE customerinfo

(

customerid INT NOT NULL,

PRIMARY KEY(customerid)

)TYPE = INNODB;

CREATE TABLE orderinfo

(

orderid INT NOT NULL,

customerid INT NOT NULL,

PRIMARY KEY(customerid,orderid),

FOREIGN KEY (customerid) REFERENCES customerinfo

(customerid) ON DELETE CASCADE

)TYPE = INNODB;

注意:'ON DELETE CASCADE',该参数保证当customerinfo表中的一条记录删除的话同时也会删除order。

表中的该用户的所有记录,注意使用外键时要定义数据库引擎为INNODB。

二、选择正确的存储引擎?

在MySQL中有两个存储引擎:MyISAM和InnoDB,每个引擎都有利有弊。

MyISAM适合于一些需要大量查询的应用,但其对于有大量写操作的支持并不是很好。甚至只是需要update一个字段,整个表都会被锁起来,而其他进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。

InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。但是它支持“行锁”,于是在写操作比较多的时候,会更优秀。并且,它还支持更多的高级应用,例如事务。

三、【真题231】 用什么方法检查PHP脚本的执行效率(通常是脚本执行时间)和数据库SQL的效率(通常是数据库query时间),并定位和分析脚本执行和数据库查询的瓶颈所在?

参考答案:检查PHP脚本的执行效率的方法如下:可以在检查的代码开头记录一个时间,然后在代码的结尾也记录一个时间,结尾时间减去开头时间取这个时间的差值,从而检查PHP的脚本执行效率,记录时间可以使用microtime()函数。

检查数据库SQL的效率的方法如下:可以通过explain显示MySQL如何使用索引来处理select语句及连接表,帮助选择更好的索引和写出更优化的查询语句。然后启用slow query log记录慢查询,通过查看SQL的执行时间和效率来定位分析脚本执行的问题和瓶颈所在。

四、 以下代码的运行结果为(    )。

<?php

mysql_connect('localhost','root',"");

$result = mysql_query("SELECT id,name FROM tb1");

while($row = mysql_fetch_array($result,MySQL_ASSOC)){

echo' ID:' .$row[0].' Name:' .$row[];

}

?>

A.报错    B.循环换行打印全部记录

C.无任何结果 D.只打印第一条记录

参考答案:A。

分析:因为代码中没有指明要操作的数据库名,所以会报错。

所以,本题的答案为A。

【真题222】 以下说法正确的是(    )。

A.使用索引能加快插入数据的速度

B.良好的索引策略有助于防止跨站攻击

C.应当根据数据库的实际应用合理设计索引

D.删除一条记录将导致整个表的索引被破坏

参考答案:C。

分析:索引的作用主要是帮助数据库快速查找到对应的数据,并不能加快插入数据的速度,所以,选项A错误。

索引不能够帮助防止跨站攻击,所以,选项B错误。

创建合理的索引需要分析数据库的实际用途并找出它的弱点。优化脚本中的冗余查询同样也能提高数据库效率。索引是占用物理空间的,所以在实际的应用中是要合理设计使用索引的。所以,选项C正确。

索引是一种表结构,删除一条数据也不会影响到整个表的索引,并且索引不一定是数字,也可以是字符串。所以,选项D错误。

【真题223】 下列关于全文检索技术的说法中,不正确的是(    )。

A.Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL做全文搜索,它可以提供比数据库本身更专业的搜索功能

B.Solr是新一代的全文检索组件,它比Lucene的搜索效率高很多,还能支持HTTP的访问方式,PHP调用Solr也很方便

C.MySQL中把一个字段建立FULLTEXT索引,就可以实现全文检索,目前MyISAM和InnoDB的table都支持FULLTEXT索引

D.Lucene附带的二元分词分析器CJKAnalyzer切词速度很快,能满足一般的全文检索需要

参考答案:B。

分析:Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL、PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

Solr是一个独立的企业级搜索应用服务器,用户可以通过HTTP请求访问,它是采用JAVA5开发,基于Lucene的全文搜索服务器,同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。并且Solr比Lucene的搜索效率高很多,但是PHP调用Solr并不方便,选项B的说法错误。

MySQL中的MyISAM和InnoDB都是支持FULLTEXT全文索引的。全文搜索引擎可以在不使用模板匹配操作的情况下查找单词或短语。

真题153:PHP连接MySQL的方法

1.建立连接MySQL服务器

在PHP中,首先要与MySQL服务器建立连接后才能连接数据库,用于连接MySQL服务器的函数是mysql_connect()函数,语法格式如下:

resource mysql_connect([string $server [, string $username [, string $password [, bool $new_link [, int $client_flags ]]]]])

如果使用同样的参数第二次调用mysql_connect()函数,那么将不会建立新连接,而将返回已经打开的连接标志。参数$new_link指定在这种情况下是否建立新的连接,值为TRUE表示建立新的连接,值为FALSE时返回已经建立连接的句柄,默认值为FALSE。

PHP还提供了另外一个用于连接MySQL服务器的函数:mysql_pconnect()。该函数用于建立一个与MySQL服务器的持久连接。

2.选择数据库

连接到服务器后,可以选择需要使用的数据库,使用mysql_select_db()函数,语法格式如下:

bool mysql_select_db(string $database_name [, resource $ link_identifier ])

说明:$database_name参数为要选择的数据库名,可选参数$lin_identifier 为一个连接标志符,如果没有指定,则使用上一个打开的连接。如果之前没有已经打开的连接,则本函数尝试调用一个无参数的 mysql_connect()函数来打开一个连接并使用。本函数运行成功返回TRUE,否则返回FALSE。

3.关闭连接

当一个已经打开的连接不再需要时,可以使用mysql_close()函数将其关闭,语法格式如下:

bool mysql_close([ resource $link_identifier ])

可选参数$link_identifier为指定的连接标志符,如果省略,则关闭上一个打开的连接。

【真题227】 以下代码的运行结果为(    )。

<?php

mysql_connect('localhost','root',"");

$result = mysql_query("SELECT id,name FROM tb1");

while($row = mysql_fetch_array($result,MySQL_ASSOC)){

echo' ID:' .$row[0].' Name:' .$row[];

}

?>

A.报错    B.循环换行打印全部记录

C.无任何结果 D.只打印第一条记录

参考答案:A。

分析:因为代码中没有指明要操作的数据库名,所以会报错。

所以,本题的答案为A。

 

购买链接:京东购买

题目来自《PHP程序员面试笔试宝典》,里面涵盖了近三年了各大型企业常考的PHP面试题,针对面试题提取出来各种面试知识也涵盖在了本书。

更多PHP面试笔试真题可以浏览:www.shuaiqi100.com  

更多有趣有料的PHP面试笔试资料可以关注:“琉忆编程库”

或者浏览:www.shuaiqi100.com 获取。

PHP程序员面试笔试宝典下载:https://pan.baidu.com/s/1-ES2ZI3z5Lhv-zTKFmJDSQ

PHP面试笔试宝典的更多相关文章

  1. 《Java程序员面试笔试宝典》终于在万众期待中出版啦~

    <Java程序员面试笔试宝典>终于在万众期待中出版啦~它是知名畅销书<程序员面试笔试宝典>的姊妹篇,而定价只要48元哦,恰逢求职季节,希望本书的出版能够让更多的求职者能够走进理 ...

  2. 程序员求职之道(《程序员面试笔试宝典》)之求职有用网站及QQ群一览表

    技术学习网站 www.csdn.com www.iteye.com www.51cto.com http://www.cnblogs.com/ http://oj.leetcode.com/ http ...

  3. 《Java程序猿面试笔试宝典》之Java与C/C++有什么异同

    Java与C++都是面向对象语言,都使用了面向对象思想(比如封装.继承.多态等),因为面向对象有很多非常好的特性(继承.组合等),使得二者都有非常好的可重用性. 须要注意的是,二者并不是全然一样,以下 ...

  4. 新书出版 |《Oracle程序员面试笔试宝典》

    新书出版 |<Oracle程序员面试笔试宝典> <Oracle程序员面试笔试宝典> 丛书[数据库 面试 笔试宝典]已在京东.淘宝和天猫预售,一共 5 本,目前市场上已有4本,丛 ...

  5. 《Java程序猿面试笔试宝典》之组合与继承有什么差别

    组合和继承是面向对象中两种代码复用的方式. 组合是指在新类里面创建原有类的对象,反复利用已有类的功能.继承是面向对象的主要特性之中的一个,它同意设计人员依据其他类的实现来定义一个类的实现. 组合和继承 ...

  6. 《Java程序猿面试笔试宝典》之Java程序初始化的顺序是如何的

    在Java语言中.当实例化对象时.对象所在类的全部成员变量首先要进行初始化,仅仅有当全部类成员完毕初始化后,才会调用对象所在类的构造函数创建对象.    Java程序的初始化一般遵循以下三个原则(以下 ...

  7. .Net工程师面试笔试宝典

    .Net工程师面试笔试宝典 传智播客.Net培训班内部资料 http://net.itcast.cn 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面 ...

  8. 《Java程序猿面试笔试宝典》之 什么是AOP

    AOP(Aspect-Oriented Programming.面向切面编程)是对面向对象开发的一种补充,它同意开发者在不改变原来模型的基础上动态地改动模型从而满足新的需求.比如.在不改变原来业务逻辑 ...

  9. 《Java程序猿面试笔试宝典》之volatile有什么作用

    在由Java语言编写的程序中.有时候为了提高程序的执行效率,编译器会自己主动对其进行优化,把经常被訪问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(比如寄存器)中来读取这个值.而不会去内 ...

  10. 《Java程序猿面试笔试宝典》之字符串创建与存储的机制是什么

    在Java语言中.字符串起着非常关键的数据.字符串的声明与初始化主要有例如以下两种情况:(1) 对于String s1=new String("abc")语句与String s2= ...

随机推荐

  1. [flask] jinja自定义filter来过滤html标签

    问题描述 数据库存储了html格式的博客文章,在主页(index)显示的时候带有html标签,如何过滤掉呢? 解决方案 用jinja自定义filter过滤掉html标签 我是用的工厂函数,因此在工厂函 ...

  2. nvm安装vue-cli

    使用nvm可以更换nodejs版本.方便不同项目的切换 1.安装nvm(本人提供版本为1.1.9,当前最新) ① 到官网自行下载 https://github.com/coreybutler/nvm- ...

  3. ELF文件格式学习总结

    ELF文件格式学习总结 ELF文件格式学习总结1. 概述2. 目标文件结构3. ELF文件头3.1 魔数3.2 文件类型3.3 机器类型4. ELF文件内容4.1段表4.2字符串表(.**strtab ...

  4. 【刷题-LeetCode】165 Compare Version Numbers

    Compare Version Numbers Compare two version numbers version1 and version2. If *version1* > *versi ...

  5. word缺失字体问题

    问题 有时候word会确实一些公文使用的字体,所以会用微软雅黑进行自动替换.所以你看到和打印的仿宋等字体,会被替换成微软雅黑,这对于政府公文或者企业行政文档是不好的. 这里面的字体替换你可以用一些字体 ...

  6. CMake语法—普通变量与子目录(Normal Variable And Subdirectory)

    目录 CMake语法-普通变量与子目录(Normal Variable And Subdirectory) 1 CMake普通变量与子目录示例 1.1 代码目录结构 1.2 父目录CMakeLists ...

  7. Collection的使用

    常用方法 Modifier and Type Method and Description boolean add(E e) 确保此集合包含指定的元素(可选操作). boolean addAll(Co ...

  8. WPF学习笔记(四):AvalonEdit 代码高亮编辑控件专题

    AvalonEdit 是一个基于 WPF 的文本编辑器组件.它是由 Daniel Grunwald 为 SharpDevelop 编写的.从 5.0 版开始,AvalonEdit 根据MIT许可证发布 ...

  9. 记一次redis 基于spring实现类对同一个KEY序列化内容不同导致一次事故

    我们的场景是这样的 我们对一个key:比如list.point.card:1 @Resourceprivate RedisTemplate<String, Long> redisTempl ...

  10. golang中的标准库flag

    Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单. os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数. ...