欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP面试总结

程序员文章站 2022-05-26 14:07:31
...
  从8月15号来到北京一直到今天,一月有余。来的这段时间一直准备笔试面试,大大小小的公司,乱七八糟面了10多家,近期才安顿下来。面试的这段时间感觉自己成长了不少。初来到这个陌生的城市一脸茫然,不会乘地铁、不会有挤公交、不会恰如其分的生活。。。

  面试是进入职场的第一道坎,因为我本身学校太一般的问题在面试中遇到了各种不爽,和那些高学历的相比自己真是信心大跌。我面试的方向是php开发工程师,主要做网站后台、APP接口等。我所面试的公司、试题、心得都在我的个人网站上,感兴趣的可以看看:http://dwz.cn/1KMpea。下面是我这段时间总结的面试方面的常考常问的知识点,希望对大家有所帮助,不对之处欢迎指出。

总结:

php部分我是按照面试常问的问题总结的,下面的问题在面试中出场率很高。问题比较基础

--------------------PHP部分---------------------

PHP中几个输出函数echo,print(),print_r(),sprintf(),var_dump()的区别

1:echo:是语句不是函数,没有返回值,可输出多个变量值,不需要圆括号。不能输出数组和对象,只能打印简单类型(如int,string)。

2:print:是语句不是函数,有返回值 1 ,只能输出一个变量,不需要圆括号。不能输出数组和对象,只能打印简单类型(如int,string)。

3:print_r:是函数,可以打印复合类型,例如:stirng、int、float、array、object等,

输出array时会用结构表示,而且可以通过print_r($str,true)来使print_r不输出而返回print_r处理后的值

4:printf:是函数,把文字格式化以后输出(参看C语言)

5:sprintf:是函数,跟printf相似,但不打印,而是返回格式化后的文字(该函数把格式化的字符串写写入一个变量中,而不是输出来),其 他的与printf一样。

例如: $str = "Hello"; $number = 123;

$txt = sprintf("%s world. Day number %u",$str,$number); //输出: Hello world. Day number 123

6:var_dump():函数,输出变量的内容、类型或字符串的内容、类型、长度。常用来调试。

写个函数来解决多线程同时读写一个文件的问题。

 1 php
 2$fp = fopen("/tmp/lock.txt","w+");
 3if(flock($fp, LOCK_EX)){// 进行排它型锁定 4fwrite($fp,"Write something here\n");
 5flock($fp, LOCK_UN);// 释放锁定 6     }else{
 7echo "Couldn't lock the file !";
 8    }
 9fclose($fp);
10 ?>

禁掉cookie的Session使用方案,设置Session过期的方法,对应函数:

通过 url 传值,把Session id附加到url上(缺点:整个站点中不能有纯静态页面,因为纯静态页面Session id 将无法继续传到下一页面)

通过隐藏表单,把Session id 放到表单的隐藏文本框中同表单一块提交过去(缺点:不适用标签这种直接跳转的非表单的情况)

直接配置php.ini文件,将php.ini文件里的Session.use_trans_sid= 0设为1,(好像在win上不支持)

用文件、数据库等形式保存Session ID,在跨页过程中手动调用

 1 第一种  setcookie() 直接用setcookie设置Session id的生命周期。
 2 3$lifetime=60; //保存1分钟  4Session_start(); 
 5setcookie(Session_name(), Session_id(), time()+$lifetime, "/");
 6 第二种  Session_set_cookie_params()    
 7$lifetime=60;//保存1分钟 8Session_set_cookie_params($lifetime);
 9Session_start();
10Session_regenerate_id(true);
11     其中Session_regenerate_id();方法用于改变当前Session_id的值,并保留Session中数组的值。参数默认为 false,如果设置为true则改变Session_id的值,并清空当前Session数组。

json格式数据有哪些特点

JSON 一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、 Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)。

JSON的结构基于下面两点

1. "名称/值"对的集合 不同语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),键列表(keyed list)等
2. 值的有序列表 多数语言中被理解为数组(array)

php获取文件内容的方法,对应的函数

1:file_get_contents得到文件的内容(可以以get和post的方式获取),整个文件读入一个字符串中

2:用fopen打开url, 以get方式获取内容(借助fgets()函数)

3:用fsockopen函数打开url(可以以get和post的方式获取),以get方式获取完整的数据,包括header和body

4:使用curl库获取内容,使用curl库之前,需要查看php.ini,查看是否已经打开了curl扩展

php数组函数常见的那些? (array_merge、in_array的作用)

一、数组操作的基本函数

array_values($arr); //获得数组的值

array_keys($arr); //获得数组的键名

array_flip($arr); //数组中的值与键名互换(如果有重复前面的会被后面的覆盖)

array_search('PHP',$arr); //检索给定的值,加true则是严格类型检查

array_reverse($arr); //将数组中的元素翻转

in_array("apple", $arr); //在数组中检索apple

array_key_exists("apple", $arr); // 检索给定的键名是否存在数组中

array_count_values($arr); // 统计数组中所有值出现的次数

二、数组的分段和填充

array_slice($arr, 0, 3); //可以将数组中的一段取出,此函数忽略键名(数组的分段)

array_splice($arr, 0, 3,array("black","maroon")); //可以将数组中的一段取出,与上个函数不同在于返回的序列从原数组中删除

array_chunk($arr, 3, TRUE); //可以将一个数组分割成多个,TRUE为保留原数组的键名(分割多个数组)

四、数组与栈,列队

array_push($arr, "apple", "pear"); //将一个或多个元素压入数组栈的末尾(入栈),返回入栈元素的个数

array_pop($arr); // 将数组栈的最后一个元素弹出(出栈)

array_shift($arr); //数组中第一个元素移出并返回(数组长度减1,其他元素向前移动一位,数字键名改为从零计数,文字键名不变)

array_unshift($arr,"a",array(1,2)); //在数组的开头插入一个或多个元素


六、数组的排序

sort($arr); //由小到大,忽略键名 rsort($arr); //由大到小,忽略键名

asort($arr); //由小到大,保留键名 arsort($arr); // 由大到小,保留键名

ksort($arr); //按照键名正序排序 krsort($arr); // 按照键名逆序排序

七、数组的计算

array_sum($arr); //对数组内部的所有元素做求和运算(数组元素的求和)

array_merge($arr1, $arr2); //合并两个或多个(相同字符串键名,后面覆盖前面,相同的数字键名,后面的附加到后面)

array_diff($arr1, $arr2); //返回差集结果数组 array_diff_assoc($arr1, $arr2, $arr3); //返回差集结果数组,键名也做比较

array_intersect($arr1, $arr2); //返回交集结果数组 array_intersect_assoc($arr1, $arr2); //返回交集结果数组,键名也做比较


八、其他的数组函数

array_unique($arr); //移除数组中重复的值,新的数组中会保留原始的键名

shuffle($arr); // 将数组的顺序打乱

php魔术方法与魔术常量

方法:__construct(),__destruct(), 方法重载:__call(),__callStatic()。

属性重载:__get(),__set(),__isset(),__unset(),这四个只对类中,私有,受保护的成员属性有效

__toString(),__autoload();

_set_state(); //自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。 本方法的唯一参数是一个数组。

__clone(); //通常用于对副本进行重新初始化,

说明:this指副本对象引用,that指原对象引用 等方法在 PHP 中被称为”魔术方法”。PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

常量:__LINK__ //文件中的当前行号

__FILE__ //文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

__DIR__ //文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录,它等价于 dirname(__FILE__)。

__FUNCTION__ //函数名称。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

__CLASS__ //类的名称。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

__METHOD__ //类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

__NAMESPACE__ //当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

PHP 如何获取客户端的IP地址,

用$_SERVER获取的IP地址有什么问题?

$_SERVER['REMOTE_ADDR'] ; 通过全局数组来获得

getenv('REMOTE_ADDR') ; 通过环境变量来获得

当客户机使用代理的时候获取不到真实的IP地址

写一个函数,可以遍历文件夹下的所有文件和文件夹。

 1function get_dir_info($path){
 2$handle = opendir($path);//打开目录返回句柄 3while(($content = readdir($handle))!== false){
 4$new_dir = $path . DIRECTORY_SEPARATOR . $content;
 5if($content == '..' || $content == '.'){
 6continue;
 7                }
 8if(is_dir($new_dir)){
 9echo "
目录:".$new_dir . '
'; 10 get_dir_info($new_dir); 11 }else{ 12echo "文件:".$path.':'.$content .'
'; 13 } 14 } 15 } 16 get_dir_info($dir);

有mail.log的一个文档,内容为若干邮件地址,用’\n’分隔换行。挑选sina.com的地址(包括从文件读取、过滤到列印出来)。

思路1:用正则表达式(比较慢,效率地,不推荐用)

思路2:cat mail.log | grep sina.com

PHP缓存技术有哪些? tp是局部还是完全缓存?

1. 全页面静态化缓存,也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程
2. 页面部分缓存,将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示
3. 数据缓存,通过一个id进行请求的数据,将数据缓存到一个php文件中,id和文件是对应的,下次通过这个id进行请求时 直接读php文件
4. 查询缓存,和数据缓存差不多,根据查询语句进行缓存;
5. 常用的缓存技术有:redis和memcache
个人认为tp应该是全局缓存 因为:tp缓存实在本地生成一个php文件来存储数据库中读取出来的数据

strlen()与mb_strlen的作用与区别

在PHP中,strlen与mb_strlen是求字符串长度的函数

PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍(在 UTF-8编码下,一个汉字占3个字节)。

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。


需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

写一个函数,尽可能高效的从一个标准url中取出扩展名

$arr = parse_url('http://www.sina.com.cn/abc/de/fg.php?id=1');

$result = pathinfo($arr['path']);var_dump($arr);

var_dump($result['extension']);

php.ini 中safe mod关闭 影响哪些函数和参数,至少写6个?

move_uploaded_file() exec()

system() passthru()

popen() fopen()

mkdir() rmdir()

rename() unlink()

copy() chgrp()

chown() chmod()

touch() symlink()

link() parse_ini_file()

set_time_limit() max_execution_time mail()

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

 1 ?php