PHP面试题一

一、字符串”\r”,”\n”,”\t”,”\x20”分别代表什么
答案: “\r”代表的含义是:
在Linux、unix 中表示返回到当行的最开始位置,在Mac OS 中表示换行且返回到下一行的最开始位置,相当于Windows 里的 \n 的效果。
“\n”代表的含义是:
在Windows 中表示换行且回到下一行的最开始位置。相当于Mac OS 里的 \r 的效果,在Linux、unix 中只表示换行,但不会回到下一行的开始位置。
“\t”所代表的含义是:
键盘上的“TAB”键,跳格(移至下一列)。
“\x20”所代表的含义是:是32在ASCII表中16进制的表示。
二、PHP函数中传值和传引用的区别
(1).函数传值:默认情况下,函数参数通过值传递,所以即使在函数内部改变参数的值,也不会改变函数外部的值。
<?php
function test($i){
i + = 10 ; v a r d u m p ( i+=10; var_dump( i+=10;vardump(i);//12
}
m = 2 ; t e s t ( m=2; test( m=2;test(m);
var_dump($m);//2
?>

(2).函数传引用:可以通过在参数前添加&符号,代表通过引用传递参数,在函数内部对其所做的操作影响其本身
function test(&$i){
i + = 10 ; v a r d u m p ( i+=10; var_dump( i+=10;vardump(i);//12
}
m = 2 ; t e s t ( m=2; test( m=2;test(m);
var_dump($m);//12

注意一定如果是引用传递,传入的参数必须是变量,如果是字符串或者数字,那就是值传递。
三、函数中global和static的区别及作用

全局变量:在所有的函数的外部声明的变量叫全局变量,拥有全局作用域。全局变量可以被在脚本中的任何地方访问,但在函数中访问需要使用 global 关键字。
static关键字:变量值不随函数运行完而销毁,之后再运行函数时还保留之前运行函数的值。
四、时间处理函数及适用场景
1)checkdate( m o n t h , month, 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”)获取到的是三天后的时间戳。
五、join,left join,right join 适用场景 区别

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录。

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录。

左连接和右连接适用场景,如:员工表中有个字段是详细地址信息表的主键id,这两个表相关联时,就可以用左连接或右连接,因为在详细地址信息表中找不到某员工的地址信息也要将员工这条记录显示出来,相应的详细地址信息字段为空即可,而不能因为地址没有存在数据库里,这个员工就没了(简单理解成不重要的信息不影响整条记录的显示)

inner join(等值连接) 只返回两个表中联结字段相等的行。

内连接的适用场景:相连接的两个表中必须在某个字段上有相等的值才可以将整条记录显示出来,如一条服务单记录在了两个表中,A表中记录了该服务单的服务时间、坐席名称和录音地址等基本信息,B表中记录了该服务单的业务详情,如保险单号,车牌号,保单日期等,当显示该服务单时,要将A表与B表做内连接,因为少这两表任何一个表,该服务单都不算完整,缺失的信息会使业务上没法继续。
六、数组处理函数
1.count($contact,‘可选参数0/1’):
统计数组的元素个数,可选参数表示是否递归的检测多维数组,0为不检测,1为检测

2.array_merge()合并两个数组
3.array_unique($contact):
删除数组中的重复元素值,重复的元素,键名保留第一个元素的键名

4.sort()将数组按照键值升序排序,rsort()降序排序
ksort()将数组按照键名升序排序,krsort()降序排序
asort()在sort()的基础上保持索引关系
usort()自定义函数以键值排序
5、next() prev() reset()指针移动
6、explode() implode() join() 数组字符串变化
7、empty() 判断数组是否为空
七、session和cookie的区别
1、cookie数据存放在客户端浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE,进行COOKIE欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议: 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE
八、数据库优化方法
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=' t i t l e ′ w h e r e c u s t o m e r i d = &quot; . title&#x27; where customerid=&quot;. titlewherecustomerid=".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;

九、MySQL数据库中的字段类型varchar和char的主要区别是什么?哪种字段的查找效率要高,为什么?
参考答案:varchar是变长,节省存储空间,char是固定长度。查找效率char型比varchar快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些。
十、PHP开发框架 区别
CodeIgniter是一个轻量级的PHP开发框架,具有快速开发、灵活性高等优点,它特别适合互联网公司的快速迭代(版本更新的意思)场景。 CodeIgniter具有动态实例化、松耦合、组件单一性等很多优点。动态实例化是指组件的导入和函数在执行时才会生效。松耦合是指系统模块之间的关联依赖很少,确保系统具有很好的重用性和灵活性。框架内的类和功能都是高度自治的,具有非常好的组件单一性。
Zend Framework是完全基于PHP语言的针对Web应用开发的框架,与众多的其他PHP开发框架相比,Zend Framework是一个PHP“官方”的框架,它由Zend公司负责开发和维护。Zend Framework同样基于MVC模式,Zend Framework采用了ORM(Object Relational Mapping,对象关系映射)思路,这是一种为了解决面向对象编程与关系数据库存在的互不匹配现象的技术。简单地说,这种技术将数据库中的一个表映射为程序中的一个对象,表中的字段映射为对象的属性,然后通过提供的方法完成对数据库的操作。
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
十一、redis和Memcached区别
1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
4、灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过AOF恢复;
5、过期策略–memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;
十二、redis数据类型及使用
String常用命令:set,get,decr,incr,mget 等。
如果只用string类型,redis可以被看作加上持久化特性的memcached

List常用命令:lpush,rpush,lpop,rpop,lrange等。
比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现

Set 常用命令:sadd,spop,smembers,sunion 等。
qq好友推荐
Sortset 常用命令:zadd,zrange,zrem,zcard等
获得热门帖子
Hash常用命令:hget,hset,hgetall 等。
Redis的Hash结构可以使你像在数据库中Update一个属性一样只修改某一项属性值。

十五、get和post请求的区别
最直接的区别,GET请求的参数是放在URL里的,POST请求参数是放在请求body里的;
Get方式可缓存,post不可以(get直接获取数据,不更新服务器端数据)
GET请求的URL传参有长度限制,而POST请求没有长度限制;
GET请求的参数只能是ASCII码,所以中文需要URL编码,而POST请求传参没有这个限制;
十六、正则表达式
特殊字符
?匹配子表达式零次或一次

*匹配子表达式零次多次

+匹配子表达式一次多次

^匹配输入字符串的开始位置

$匹配输入字符串的结尾位置

. 匹配除换行符 \n 之外的任何单字符

.*? 表示匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复
十七、linux日志中查找某个字符串
管道:前者输出是后者输入参数
在指定文件中搜索内容 grep 被搜索内容 文件
cat log.log | grep “train”  # 返回log.log中包含train的所有行
十八、魔术方法常见有哪些、tp中空控制器作用 空控制器:在实例化控制器对象时,没找到指定的类

__construct()构造方法,使用类实例化一个对象时自动执行

__destruct()析构方法,在对象被销毁(unset或PHP执行结束)时自动执行
功能作用:通常用于释放对象占用的第三方资源(如:数据库)

__toString()转换字符串
执行时机:在对象被当成字符串使用时自动执行
功能作用:兼容对象的字符串调用形式,根据用户需求显示出对象的字符串形态

__clone()克隆方法
执行时机:在克隆(clone)对象时自动执行
功能作用:在克隆对象时可以同时执行一些其它操作,甚至可以阻止对象被克隆

__call()调用一些不存在的对象方法的异常处理,使得程序继续正常运行

_get() _set() _autoload()

二十二、include和require的区别
require和include有着相似的功能:
将指定文件中的所有代码/文本/标记复制到使用require或include语句的文件中。

require() :如果文件不存在,会报出一个 fatal error.脚本停止执行

include() : 如果文件不存在,会给出一个 warning,但脚本会继续执行

推荐使用require_once()和include_once(),可以检测文件是否有重复包含。
二十三、事物概念、四大特性
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句

事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
二十四、建立索引
SELECT * FROM mytable WHERE category_id=1;
最直接的应对之道,是为category_id建立一个简单的索引:
CREATE INDEX mytable_categoryid
 ON mytable (category_id);
OK,搞定?先别高兴,如果你有不止一个选择条件呢?例如:
SELECT * FROM mytable WHERE category_id=1 AND user_id=2;
你的第一反应可能是,再给user_id建立一个索引。不好,这不是一个最佳的方法。你可以建立多重的索引。
CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);
二十五、数组初始化
(1) 单独给数组中的元素赋值
a [ “ c o l o r ” ] = ” r e d ” ; a[“color”]=”red”; a[color]=red;a[“taste”]=”sweet”;
(2) 把所有元素一起初始化
$a=array(“color”=>”red”,”taste”=>”sweet”);
二十六、截取中文字符串问题
https://www.cnblogs.com/sgm4231/p/9771496.html
二十六、HTTP状态码
HTTP协议中状态码常用的:
200 返回正常

304 服务端资源无变化,可使用缓存资源

400 请求参数不合法

401 未认证

403 服务端禁止访问该资源

404 服务端未找到该资源

500 服务端异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值