php字段验证 并给出其理由,PHP面试汇总基础(一)

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

阅读原文(码农快讯)

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 )

2.string fgets ( int $handle [, int $length ] )

3.string fgetss (resource $handle [, int $length [, string $allowable_tags ]] )

$content){

echo 'line '.($line + 1).':'.$content;

}

?>

5.int readfile ( string $filename [, bool $use_include_path [, resource $context ]] )

6.string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] )

array(

'timeout' => 1 //设置超时

)

)

);

echo file_get_contents("http://www.baidu.com/", 0, $ctx);

?>

7.int fpassthru ( resource $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不支持持久化

阅读原文(码农快讯)

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

扫码关注我们

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值