PHP面试总结2020

什么是面向对象?

面向对象的方法主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想。总体来说面向对象的底层还是面向过程,面向过程抽象成类,然后封装,方便使用就是面向对象(万物皆对象)。
通过类的封装(encapsulation)隐藏内部细节。通过继承(inheritance)实现类的特化。通过多态(polymorphism)实现基于对象类型的动态分派。三大特征:封装、继承、多态

用 PHP 打印出前一天的时间

格式是 2020-5-10 22:21:21

echo date('Y-m-d H:i:s',time()-24*3600);
or
echo date('Y-m-d H:i:s',strtotime('-1 day'));

表单中 get 与 post 提交方法的区别?

get是从服务器上获取数据,post是是向服务器传送信息;
Get通过把参数数据提交到表单action属性url中,值和字段一一对应,在url中可以看到,post通过HTTP post将表单各个字段放置在HTML header中,静态传送到action所指的url中;
Get通过request、query string获取变量的值。Post通过服务器端request form获取提交的数据
Get传送的数据量较小,不能大于2kb。Post传送两较大,默认为不受限制,iis480kb,IIS5100kb
Get安全性低,post安全性高,get执行效率比post好

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

客户端IP:

 $SERVER[REMOTE_ADDR]

服务器IP:

$_SERVER[SERVER_ADDR]

简述单引号和双引号的用法

双引号串中的内容可以被解释而且替换,
单引号串中的内容总被认为是普通字符。

计算某段字符串中某个字符出现的次数

例如:gdfgfdgd59gmkblg 中 g 的次数) $text = ‘gdfgfdgd59gmkblg’;

 echo substr_count ( $text,'g');

普通传值与引用传值及unset


//普通传值
$param1=1; 
$param2=2; 
$param2 = $param1; 
$param1 = 5; //变量1和变量2是两块内存,互不影响;
echo $param2; //所以此处还是显示为1

//引用传值 ↓↓
$param1=1; 
$param2=2; 
$param2 = &$param1; //把变量1的内存地址赋给变量2;此时的变量2和变量1全等;
echo $param2;// 1
$param1 = 5; //变量1和变量2是一处内存,改变其中一个,另外一个也被改变;
echo $param2; //显示为5
?>


$a = 1;
$b = &$a;
unset($a);
echo $b; //1

字符串的常用函数

trim()-- ---------------去除字符串首尾处的空白字符(或者其他字符)
strlen()-- -------------字符串长度
substr()---------- ----截取字符串
str_replace()------- 替换字符串函数
substr_replace()-- 对指定字符串中的部分字符串进行替换
strstr()-- -------------检索字符串函数
explode()-- ---------分割字符串函数
implode()----------- 将数组合并成字符串
str_repeat()-- ------重复一个字符串
addslashes()------- 转义字符串
htmlspecialchars()–THML 实体转义

session 与 cookie 的区别?

session:储存用户访问的全局唯一变量,存储在服务器上的 php 指 定的目录中的(session_dir)的位置进行的存放
cookie:用来存储连续访问一个页面时所使用,是存储在客户端, 对于 Cookie 来说是存储在用户 WIN 的 Temp 目录中的。

include和require的区别是什么?

require()语句的性能与include()相类似,都是包括并运行指定文件。不同之处在于:对include()语句来说,在执行文件时每次都要进行读取和评估;而对于require()来说,文件只处理一次(实际上,文件内容替换require()语句)。这就意味着如果可能执行多次的代码,则使用require()效率比较高。另外一方面,如果每次执行代码时是读取不同的文件,或者有通过一组文件迭代的循环,就使用include()语句。

列出十个 PHP处理数组的常用函数,并说明其作用?

array_values() 返回数组的所有值,但不包括数组的键值。返回的是以数字为键值的数组,从0开始。
array_keys() 返回数组的键名,以数字为键值的数组形式,从0开始
array_flip() 将数组中的值和键进行互换,如果反转后的数组的值有相同的,那么只取最后一个值。
array_search(‘PHP’, a r r ) ; / / 检 索 给 定 的 值 , 加 t r u e 则 是 严 格 类 型 检 查 a r r a y r e v e r s e ( arr); //检索给定的值,加true则是严格类型检查 array_reverse( arr);//truearrayreverse(arr); //将数组中的元素翻转(前后顺序)
in_array(“apple”, $arr); //在数组中检索apple
array_key_exists(“apple”, a r r ) ; / / 检 索 给 定 的 键 名 是 否 存 在 数 组 中 a r r a y c o u n t v a l u e s ( arr); // 检索给定的键名是否存在数组中 array_count_values( arr);//arraycountvalues(arr); // 统计数组中所有值出现的次数
array_unique($arr); // 删除数组中重复的值

列出十个 PHP处理字符串的常用函数,并说明其作用?

输出字符串长度

echo strlen("hello");

比较两个字符串

 echo strcmp("ab","abc");

将字符串转小写

 echo strtolower("ABCD");

将字符串转大写

 echo strtoupper("abvcd");  

查找替换字符串

 echo str_replace("l","*","hellommworld"); 

拼接字符串

$arr = explode("|","a|vdf|dfs|sdf");
echo implode("*",$arr);

拆分字符串

 $arr = explode("|","a|vdf|dfs|sdf");
var_dump($arr); 

替换字符串

 echo substr_replace("hellommworld","**",5,2); 替换从索引5开始的2个字符(替换指定位置)

截取字符串

echo substr("hello",0,2);
echo substr("张三",0,3);中文字符串,一个字符占三个索引

说一下你所掌握的网页前端技术有哪些?

H5、CSS3、Js、jQuery

安全对一套程序来说至关重要 ,请说说在开发中应该注意哪些安全机制?

(1)使用验证码防止注册机灌水。
(2)使用预处理,绑定参数,参数过滤转义 防止sql注入
(3)使用token防止远程提交,使用token验证登录状态。

什么是事务?及其特性?

事务作为一个逻辑单元执行的一系列操作,一个逻辑工作必须有四个属性,称为ACID(原子性、一致性、隔离性和持久性):
原子性:事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
一致性:事务在完成时,必须使所有数据保持一致的状态,在相关数据库中,所有规则必须应用事务的修改,保持所有数据的完整性;结束时所有内部数据结构都必须正确。
隔离性:并发事务必须与其他并发事务所作的修改隔离,事务查看数据时数据所处的状态,要么是并发事务修改之前的状态,要么是另一事务修改之后的状态,事务不会查看中间状态的数据,称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态不同。
持久性:事务完成后,对于系统的响应时永久性的,该修改即使出现系统故障也将一直保持。
Begin 开始一个事务、rollback 事务回滚、commit 事务确认。Rollback和commit不能同时出现,否则只有前者一个生效。
MySQL默认自动提交,可通过set autocommit=0、1取消和开启

说说对 SQ语句优化有哪些方法?

1、Where 子句中:where 表之间的连接必须写在其他Where 条件之前,那些可以过滤掉最大数量记录的条件必须写在Where 子句的末尾.HAVING 最后。
2、用EXISTS 替代IN、用NOT EXISTS 替代NOT IN。
3、避免在索引列上使用计算
4、避免在索引列上使用IS NULL 和IS NOT NULL
5、对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引。
6、应尽量避免在where 子句中对字段进行null 值判断, 否则将导致引擎放弃使用索引而进行全表扫描
7、应尽量避免在where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

列出十条你常用的 Linux命令,并说明其作用?

x 删除光标所在位置字符
dd 删除光标所在行
ndd 删除当前行及后行
dG 删除光标所在行及到末尾
:a1,a2d 函数从a1到a2的文本
p 将剪切板中的内容粘贴到光标后
P 将剪切板中的内容粘贴到光标前
y 赋值已选中的文本到剪切板
yy 将光标所在行复制到剪切板,此命令前可加数字 可复制多行
yw 将光标所在位置的单词复制到剪切板
yum install tar 安装yum
yum remove 文件(夹)名 卸载文件
yum -qa i grep yum 检查是否安装yum
tar -xvf 文件名 解压
useradd 用户名 添加新用户
passwd 用户名 新用户密码
sudo passwd root 修改密码
sudo vi/etc/hostname 修改用户名
su - 用户名 切换用户

常见的PHP框架

thinkPHP

yii

ZendFramework

CakePhp

sy

如何理解TP中的单一入口文件?

ThinkPHP采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目都有一个统一(但不一定是唯一)的入口。应该说,所有项目都是从入口文件开始的,并且所有的项目的入口文件是类似的,入口文件中主要包括:

定义框架路径、项目路径和项目名称(可选)

定义调试模式和运行模式的相关常量(可选)

载入框架入口文件(必须)

ThinkPHP中的MVC分层是什么?(理解)

MVC 是一种将应用程序的逻辑层和表现层进行分离的方法。ThinkPHP 也是基于MVC设计模式的。MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在:

模型(M):模型的定义由Model类来完成。

控制器(C):应用控制器(核心控制器App类)和Action控制器都承担了控制器的角色,Action控制器完成业务过程控制,而应用控制器负责调度控制。

视图(V):由View类和模板文件组成,模板做到了100%分离,可以独立预览和制作。

但实际上,ThinkPHP并不依赖M或者V ,也就是说没有模型或者视图也一样可以工作。甚至也不依赖C,这是因为ThinkPHP在Action之上还有一个总控制器,即App控制器,负责应用的总调度。在没有C的情况下,必然存在视图V,否则就不再是一个完整的应用。

总而言之,ThinkPHP的MVC模式只是提供了一种敏捷开发的手段,而不是拘泥于MVC本身。

ThinkPHP如何防止SQL注入?(理解)

(1)查询条件尽量使用数组方式,这是更为安全的方式;

(2)如果不得已必须使用字符串查询条件,使用预处理机制;

(3)开启数据字段类型验证,可以对数值数据类型做强制转换;(3.1版本开始已经强制进行字段类型验证了)

(4)使用自动验证和自动完成机制进行针对应用的自定义过滤;

(5)使用字段类型检查、自动验证和自动完成机制等避免恶意数据的输入。

如何开启调试模式?调试模式有什么好处?

答:开启调试模式很简单,只需要在入口文件中增加一行常量定义代码:

,bv

    //开启调试模式

    define('APP_DEBUG', true);

    //加载框架入口文件

    require './ThinkPHP/ThinkPHP.php';

在完成开发阶段部署到生产环境后,只需要删除调试模式定义代码即可切换到部署模式。开启调试模式后,系统会首先加载系统默认的调试配置文件,然后加载项目的调试配置文件,调试模式的优势在于:

开启日志记录,任何错误信息和调试信息都会详细记录,便于调试;

关闭模板缓存,模板修改可以即时生效;

记录SQL日志,方便分析SQL;

关闭字段缓存,数据表字段修改不受缓存影响;

严格检查文件大小写(即使是Windows平台),帮助你提前发现Linux部署问题;

可以方便用于开发过程的不同阶段,包括开发、测试和演示等任何需要的情况,不同的应用模式可以配置独立的项目配置文件。

你可能感兴趣的:(PHP面试总结2020)