PHP面试基础篇收集了一些常见的基础面试题

1.什么是引用变量,在PHP中引用变量如何定义?

不同的变量名引用同一变量内容(同一地址),用&表示$a=100;$b=&$a;
PHP引用变量

延伸:引用变量的原理及应用场景
原理:后定义的变量指向先定义变量的内存地址,销毁任意一个变量不会引起内存的变化,即未销毁变量的值不会改变,改变任意变量的值(即内存空间发生变化),两者皆会改变

应用场景:引用变量在于代码优化,可以节省内存的占用(对象本身就是引用传值)

牛刀小试:

//写出如下程序的输出结果
$a = range(0,3);
foreach ($a as $key=>$value){
    $value = &$a[$key];
}
//请写出每次循环结束后$a的值,并解释。
//请写出循环结束后$a的值,并解释。

/**
* 每次循环的结果:
*第一次$value = 0,$key = 0,$value引用$a[0]的值,引用传值$a[0]=0,即第一次循环结果['0'=>0,'1'=>1,'2'=>2,'3'=>3],
*第二次$value = 1,$key = 1,$value引用$a[1]的值,引用传值$a[1]=1,但第一次$value的值并未销毁所以$a[0]值不变,所以第二次结果['0'=>1,'1'=>1,'2'=>2,'3'=>3],
*依此类推,第三次循环['0'=>1,'1'=>2,'2'=>2,'3'=>3],第四次循环['0'=>1,'1'=>2,'2'=>3,'3'=>3]
*循环结束:循环结束的值为最后一次循环结束后的值为['0'=>1,'1'=>2,'2'=>3,'3'=>3]
*/

2.PHP中字符串的定义方式以及各自的区别

定义方式:单引号、双引号、heredoc以及nowdoc
1单引号不解析变量,不能解释转义,只能解析单引号和 '\\''\'' ,变量字符串之前用.连接
2双引号可以解析变量"abc{$d}he",可以包含特殊字符,可以解析转义字符,也可以用.,单引号效率更高
3Heredoc 和 Nowdoc 语法能够在使用多行长字符串时起到很大帮助,语法结构以<<<开始,在该运算符之后要提供一个标识符,然后换行。接下来是字符串 string 本身,最后要用前面定义的标识符作为结束标志。

$b = <<<abc
213213213213213wqewqewqewqewqewqewq{$a}
abc;

4nowdoc 结构也用和 heredocs 结构一样的标记 <<<, 但是跟在后面的标识符要用单引号括起来,即 <<<'EOT'。Heredoc 结构的所有规则也同样适用于 nowdoc 结构,尤其是结束标识符的规则。

延伸:官方文档地址String 字符串

3.PHP数据类型

分三大类,标量、复合、特殊
标量

类型注意
整型整数
浮点型不能用于比较
字符串定义方式第二个问题给出
布尔型false的其中情况:0,0.0,'','0',false,null,[]

复合

类型注意
数组超全局数组$_GlOABLES、$_GET、$_POST、$_SERVER、$_REQUEST、$_SESSION、$_COOKIE、$_FILES、$_ENV
对象Object

特殊

| 类型 | 注意 |
| ------------ | ------------ |
| null | 为空、直接赋值null、未定义变量、unset的变量 |
|资源| 资源说的不是一种具体的值,而是一个概念的多种数据的统称 |

延伸:常量

常量的定义方式:类外用definedefine('debug',true),类外用constconst A = 123
常量不能被修改,不能被删除
PHP预定义常量:__FILE__,__LINE__,__DIR__,__FUNCTION__,__CLASS__,__TRAIT__,__METHOD__,__NAMESPACE__

4.foo()和@ foo()的区别

@错误运算符,将其放于一个表达是之前,表达式中的任何错误信息都会被忽略

延伸:运算符优先级

5.PHP遍历数组的三种方式以及区别

for、foreach、联合使用list(),each()和while
for循环索引数组,foreach既能循环索引数组也能循环关联数组,联合使用list()、each()和while也既能循环索引也能循环关联数组,foreach循环时会reset()数组

6.PHP中如何优化多个if..elseif语句

1表达式的可能性越大越往前放
2如果简单判断可用switch...case替换

7.PHP系统内置函数考察

字符串 函数 , 数组 函数 , Date/Time 函数 , 网络 函数 , PCRE 函数文件系统函数

8.正则表达式的相关考点

前往PHP正则表达式详解查看
例题1:请写出139开头的11位手机号的正则表达式

$str = '13948441113';
$pattern = '/^139[\d]{8}$/';
preg_match_all($pattern,$str,$match);
print_r($match);

例题2:请写出一个正则表达式,取出页面中所有img标签中src的值

$str = file_get_contents('http://www.cssmoban.com/');
$patt = '/<img src="(.*)" class="thumbImgs" alt=".*" \/>/';
preg_match_all($patt,$str,$match);
print_r($match);

9.PHP文件及目录处理相关

文件操作相关(常见操作)
1.fopen,fread,fgets,fgetc,fwrite,fclose等等
2.file_get_contents,file_put_contents
3.file,readfile
3.filesize(文件大小),copy(复制),unlink(删除),filetype(文件的类型),rename(重命名),flock(文件锁定)
目录操作相关(常见操作)
读取:opendir,readdir,closedir,rewinddir等
名称相关:dirname,basename,pathinfo
目录删除:rmdir(目录必须为空)
目录创建:mkdir
例题:循环遍历目录下的所有目录和文件,及子目录中的所有目录和文件

function getfile($file='')
{
    if (is_dir($file)) {
        $files = [];
        $handle = opendir($file);
        while(false!=($res = readdir($handle))){
            if ($res != '.' && $res != '..') {
                if(is_dir($file . '/' . $res)){
                    $files[][$res] = getfile($file . '/' . $res);
                }else{
                    $files[] = $res;
                }
            }
        }
        closedir($handle);
    }
    return $files;
}

10.简述cookie和session的区别和存储机制,以及存储位置和优缺点

cookie:存储与客户端浏览器中,用户有权禁止,用setcookie方式进行存储
session:存储于服务器,相对安全,同时session也是基于cookie的,当客户端禁用Cookie时传递Session时可以用get方式传递SID,存在分布式问题时可以用session_set_save_handler()函数将session存储于数据库,redis等等

延伸:为什么使用cookie&session会话控制?

HTTP是无状态协议,它不对之前的发生过的请求和响应的状态进行管理。不可否认,无状态协议当然也有它的优点。由于不必保存状态,自然可减少服务器的CPU及内存资源的消耗。从另一方面来说,也正是因为HTTP协议本身是非常简单的,所以才会被应用在各个场景里。

11.PHP面向对象相关知识

零碎知识点较多,详细说明至PHP面向对象相关知识点

12.HTTP/1.1中,状态码200,301,304,403,404,500的含义

状态码含义
200成功
301跳转
304服务端已经执行了GET,但文件未变化
403服务器理解请求,但拒绝授权
404源服务器找不到目标资源
500服务器遇到意外情况,无法完成请求

12.OSI七层模型

物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
OSI七层模型

13.常见的网络协议以及端口

网络协议端口
FTP21
telnet23
SMTP25
POP3110
HTTP80
DNS53
HTTPS443
MySQL3306

14.请简述CGI、FastCGI和PHP-FPM的区别

为了解决不同的语言处理器与web server之间的通讯,出现了CGI协议,只要按照CGI协议编写程序,就可以实现与语言解析器与web server之间的通讯。

FastCGI是用来提高CGI性能的,FastCGI每次处理完请求之后不会关闭掉进程。而是保留这个进程,使这个进程可以处理多个请求。这样的话每个请求都不用再重新创建一个进程了。大大提升了处理效率。

PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个实现了FastCGI的程序,并且提供进程管理的功能。负责监听端口,接受来自web server的请求,然后由PHP解析器,进程PHP代码的处理。

15.javascript考察点

考点较多,另篇详解 PHP面试大全javascript篇

16.写出尽可能多的Linux命令

一份整理非常全面的Linux命令,Linux常用命令大全

17.Mysql考察点

考点较多,另篇详解 PHP面试大全Mysql篇

总结

基础篇篇先完结到这儿,PHP面试考察点还有很多,知识总是需要慢慢去积累的。