百分之九十五php面试考点归类:
1、php基础知识
2、javaScript 、jQuery、Ajax基础知识
3、Linux 基础知识
4、MySQL 数据库的基础与优化
5、程序设计题
6、php框架基础知识
7、算法、逻辑思维
8、高并发解决方案
1、php基础知识考点:
引用变量、常量及数据类型、运算符及流程控制、自定义函数及内部函数、正则表达式、文件目录处理、回话控制、面向对象、网络协议、开发环境相关
4、MySQL 数据库的基础与优化
MySQL基础知识考点、MySQL如何创建高性能的索引、MySQL的SQL语句编写和优化、MySQL的高可扩展和高可用及安全性
7、算法、逻辑思维
常见数据结构特征、算法的工作原理、时间复杂度、空间复杂度、其他逻辑算法、php内置函数实现
8、高并发解决方案
如何理解高并发:pv、uv、qps 、 优化时机:QPS阶段性优化、防盗链、减少http请求、浏览器缓存、CDN、数据库缓存、mysql的读写分离、分区以及分库分表、LVS负载均衡
常见经典面试题:
1.什么是引用变量?在php当中,用什么符号定义引用变量?
2.要求写出jQuery中,可以处理AJAX的几种方法。
3.写出尽可能多的Linux命令
4.写出三种以上Mysql数据库存储引擎的名称
5.编写一个在线留言本,实现用户的在线留言功能
6.谈谈你对mvc的认识,介绍几种目前比较流行的mvc框架
7.写出常见的排序算法
8.php如何解决网站大流量与高并发的问题
问题回答:
1.什么是引用变量?在php当中,用什么符号定义引用变量?
一. PHP引用变量考察点
1. PHP的引用变量的概念及定义方式:
概念:在PHP中,引用意味着用不同的名字访问同一个变量内容;
定义方式:使用 & 符号;
二. 延伸:PHP引用变量的原理
1)赋值:将一个变量的值赋值给另一个变量,其中一个变量的值进行改变,会重新进行拷贝,此时会再开辟一个新的内存空间;
原理:实例使用了 COW(Copy On Write)机制 : 对 $a
或 $b
其中一个进行改变,内存空间才会发生改变。
// 1. 定义一个变量 $a = range(0, 1000); // 在内存中开辟一片空间,存储变量a var_dump(memory_get_usage()); //memory_get_usage — 返回分配给 PHP 的内存量 // 2. 定义变量 b,将 a变量的值赋值给 b $b = $a; // 将变量b 指向 变量a开辟的空间中 var_dump(memory_get_usage()); // 3. 对 a进行修改(对a进行写操作),此时会再开辟一片内存空间存储a和a和a和b(原来的a和a和a和b被改变) $a = range(0, 1000); var_dump(memory_get_usage());
2)引用:两个变量无论何时都共用一个内存空间(对其中一个的值进行更改的时候,不会开辟新的内存空间)
// 1. 定义一个变量 $a = range(0, 1000); //定义一个变量a(开辟一个内存空间存储变量a); var_dump(memory_get_usage()); // 2. 此处的&符号是将a变量的值赋值给b $b = &$a; var_dump(memory_get_usage());//定义变量b,将a的地址给了b,此时b与$a指向同一个内存空间,且永远指向该内存空间(不会再重新拷贝,改掉的只是该内存空间的值); // 3. 对a进行修改 $a = range(0, 1000); //对a进行修改(不会再开辟内存空间),此时a和b的值,都是修改后的值; var_dump(memory_get_usage());
3)unset 只会取消引用,不会销毁内存空间
$a = 1; // 开辟一个内存空间存储变量a,并赋值为1 $b =& $a; // 将$a的引用赋值给$b,此时$a和$b指向同一个内存空间 unset($b); // 取消的是$a和$b的引用,不会取消内存空间 echo $a; // 结果还是1
4) 对象本身就是引用传递,因此,在修改的时候,不会再重新开辟内存空间
class Animal{ public $name = 'cat'; } $a = new Animal(); //开辟一个内存空间存储$a $a1 = $a; //将$a和$a1存入同一个内存空间(内存空间会变大)同以上例子:$b = $a; $a1->name = 'dog'; // $a,$a1都为dog,指向的是同一个内存空间 echo $a->name; // dog
5) xdebug扩展
说明:php当中php变量都是通过zend引擎处理 zend引擎里面有个zval(变量容器)结构体【 查看zval结构体方法(需要装xdebug扩展):xdebug_debug_zval('查看变量') 】
打印结构:(refcount=1, is_ref=0)
refcount表示现在有一个内存空间,有一个变量在使用这个内存空间。
is_ref 表示引用变量的个数
面试题实例: $data = ['a','b','c']; foreach($data as $key=>$val){ $val = &$data[$key]; var_dump($data); // 结果:a b c b b c b c c } var_dump($val); //结果: b c c
面试题: PHP中字符串可以使用哪三种定义方式以及各自的区别是什么?
定义方式: 单引号,双引号,heredoc和newdoc
单引号区别:
单引号不能解析变量
单引号不能解析转义字符,只能解析单引号和反斜线本身
变量和变量、变量和字符串,字符串和字符串之间可以用 . 链接
双引号区别:
双引号可以解析变量,变量可以使用特殊字符和{}包含
双引号可以解析所有转义字符
也可以使用.来链接
总结区别:单引号效率高
例子:$sql = "select * from user where name = '$name'";
$sql = 'select * from user where name = \''.$username.'\'';
用于大文本:
Heredoc 类似于双引号 $str = <<< EoT xxxxxx Eot
Newdoc 类似于单引号 $str = <<< 'EoT' xxxxxx Eot
数据类型:
三大数据类型(标量,复合,特殊)
标量:浮点,整型,字符串,布尔
复合:数组,对象
特殊:null,资源(resource)
注意点: 浮点型:
$a = 0.1;
$b = 0.7;
$c = $a + $b;
if($a + $b == 0.8){
echo '不等于true'; // 原因是0.1+0.7 运算需要cpu二进制去运算中间会有损耗
}
判断体为false的有:0 , 0.0,' ' ,'0',false,array(),NULL
数组类型:
超全局数组:$GLOBALS 、$_GET、$_POST、$_REQUEST、$_SESSION、$_COOKIE、$_SERVER、$FILE、$_ENV
$_REQUEST 能获取 $_GET $_POST $_COOKIE 版本5.3以上,php.ini中有request_order属性来设置$_REQUEST。查了下php.ini, request_order设置成为了GP(Get and Post) 详细链接:http://www.cnblogs.com/yjf512/archive/2012/10/12/2720967.html
$_ENV:你可以修改php.ini文件的variables_order值为你想要的顺序,如:"EGPCS"。这时,$_ENV的值就可以取得了phperz.com
$_SERVER:
$_SERVER['SERVER_ADDR'] - 服务器端的ip地址
$_SERVER['SERVER_NAME'] - 服务端名称
$_SERVER['REQUEST_TIME'] - 请求时间
$_SERVER['QUERY_STRING'] - 问号后面的一大串有可能为空
$_SERVER['HTTP_REFERER'] - 上级请求的页面
$_SERVER['HTTP_USER_AGENT'] - 头信息中的AGENT
$_SERVER['REMOTE_ADDR'] - 客户端ip地址
$_SERVER['REQUEST_URI'] - 请求域名后面的如 www.xxx.com/index.php 结果:index.php
$_SERVER['PATH_INFO'] - 实例: localhost/curl/index.php/user/index?aa=1 标红处
NULL 三种情况
直接赋值为null、未定义的变量、unset销毁的变量
常量:
定义:const 、define
const 更快,是语言结构,define是函数
define 不能用于类常量的定义,const可以
常量一经定义,不能被修改,不能被删除
预定义常量:
__FILE__ 文件路径和文件的名称
__LINE__ 所在的行号
__DIR__ 所在的目录
__FUNCTION__ 所在的函数体,函数体名称
__CLASS__ 所在类名
__TRAIT__ 返回当前的trait名称(包括该trait的作用区域或命名空间)
__METHOD__ 返回当前的方法名(包括类名)
__NAMESPACE__ 返回当前文件的命名空间的名称。