php面试题之一——PHP核心技术(高级部分)

时间:2019-03-18
本文章向大家介绍php面试题之一——PHP核心技术(高级部分),主要包括php面试题之一——PHP核心技术(高级部分)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 

 

 

 

 

https://blog.csdn.net/yhlas/article/details/82858486

 

一、PHP核心技术

1.写出一个能创建多级目录的PHP函数(新浪网技术部)

  1.  
    <?php
  2.  
    /**
  3.  
    * 创建多级目录
  4.  
    * @param $path string 要创建的目录
  5.  
    * @param $mode int 创建目录的模式,在windows下可忽略
  6.  
    */
  7.  
    function create_dir($path,$mode = 0777)
  8.  
    {
  9.  
    if (is_dir($path)) {
  10.  
    # 如果目录已经存在,则不创建
  11.  
    echo "该目录已经存在";
  12.  
    } else {
  13.  
    # 不存在,创建
  14.  
    if (mkdir($path,$mode,true)) {
  15.  
    echo "创建目录成功";
  16.  
    } else {
  17.  
    echo "创建目录失败";
  18.  
    }
  19.  
    }
  20.  
    }
  21.  
    ?>

2.写出smarty模板的特点(新浪网技术部)

速度快,编译型,缓存技术,插件机制,强大的表现逻辑

3.打开php.ini中的safe_mode,会影响哪些函数?至少说出6个。(新浪)

safe_mode,PHP安全模式,它提供一个基本安全的共享环境,在一个有多个用户账户存在的php开发的web服务器上。当安全模式打开的时候,一些函数将被完全的禁止,而另一些函数的功能将会受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。
注意,在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了。

4.抓取远程图片到本地,你会用什么函数?(51.com笔试题)

file_get_contents或者curl

5.PHP的垃圾收集机制是怎样的(腾讯)

PHP可以自动进行内存管理,清除不再需要的对象。
PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

6.请写一段PHP代码,确保多个进程同时写入同一个文件成功(腾讯)

核心思路:加锁

  1.  
    <?php
  2.  
    $fp = fopen("lock.txt","w+");
  3.  
    if (flock($fp,LOCK_EX)) {
  4.  
    //获得写锁,写数据
  5.  
    fwrite($fp, "write something");
  6.  
     
  7.  
    // 解除锁定
  8.  
    flock($fp, LOCK_UN);
  9.  
    } else {
  10.  
    echo "file is locking...";
  11.  
    }
  12.  
    fclose($fp);
  13.  
    ?>

7.写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名,例如:http://www.sina.com.cn/abc/de/fg.php?id=1需要取出php或.php(新浪

  1.  
    <?php
  2.  
    // 方案一
  3.  
    function getExt1($url){
  4.  
    $arr = parse_url($url);
  5.  
    //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 )
  6.  
     
  7.  
    $file = basename($arr['path']);
  8.  
    $ext = explode('.', $file);
  9.  
    return $ext[count($ext)-1];
  10.  
    }
  11.  
     
  12.  
    // 方案二
  13.  
    function getExt2($url){
  14.  
    $url = basename($url);
  15.  
    $pos1 = strpos($url,'.');
  16.  
    $pos2 = strpos($url,'?');
  17.  
     
  18.  
    if (strstr($url,'?')) {
  19.  
    return substr($url,$pos1+1,$pos2-$pos1-1);
  20.  
    } else {
  21.  
    return substr($url,$pos1);
  22.  
    }
  23.  
     
  24.  
    }
  25.  
     
  26.  
    $path = "http://www.sina.com.cn/abc/de/fg.php?id=1";
  27.  
    echo getExt1($path);
  28.  
    echo "<br />";
  29.  
    echo getExt2($path);
  30.  
    ?>

相关题目:使用五种以上方式获取一个文件的扩展名,要求:dir/upload.image.jpg,找出.jpg或者jpg,必须使用PHP自带的处理函数进行处理,方法不能明显重复,可以封装成函数,比如get_ext1(filename),getext2(file_name)

8.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。(新浪)

  1.  
    <?php
  2.  
    function my_scandir($dir){
  3.  
    $files = array();
  4.  
    if(is_dir($dir)){
  5.  
    if ($handle = opendir($dir)) {
  6.  
    while (($flie = readdir($handle))!== false) {
  7.  
    if ($flie!="." && $file!="..") {
  8.  
    if (is_dir($dir."/".$file)) {
  9.  
    $files[$file] = my_scandir($dir."/".$file);
  10.  
    } else {
  11.  
    $files[] = $dir."/".$file;
  12.  
    }
  13.  
    }
  14.  
    }
  15.  
    closedir($handle);
  16.  
    return $files;
  17.  
    }
  18.  
    }
  19.  
    }
  20.  
    ?>

[!!!]9.简述论坛中无限分类的实现原理。(新浪)

创建类别表如下:

  1.  
    CREATE TABLE category(
  2.  
    cat_id smallint unsigned not null auto_increment primary key comment'类别ID',
  3.  
    cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'类别名称',
  4.  
    parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'类别父ID'
  5.  
    )engine=MyISAM charset=utf8;

编写一个函数,递归遍历,实现无限分类

  1.  
    <?php
  2.  
    function tree($arr,$pid=0,$level=0){
  3.  
    static $list = array();
  4.  
    foreach ($arr as $v) {
  5.  
    //如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
  6.  
    if ($v['parent_id'] == $pid) {
  7.  
    $v['level'] = $level;
  8.  
    $list[] = $v;
  9.  
    tree($arr,$v['cat_id'],$level+1);
  10.  
    }
  11.  
    }
  12.  
    return $list;
  13.  
    }
  14.  
    ?>

10.写一个函数,算出两个文件的相对路径,如a=′/a/b/c/d/e.php′;b='/a/b/12/34/c.php';计算出b相对于a的相对路径应该是../../c/d(新浪)

  1.  
    <?php
  2.  
    function releative_path($path1,$path2){
  3.  
    $arr1 = explode("/",dirname($path1));
  4.  
    $arr2 = explode("/",dirname($path2));
  5.  
     
  6.  
    for ($i=0,$len = count($arr2); $i < $len; $i++) {
  7.  
    if ($arr1[$i]!=$arr2[$i]) {
  8.  
    break;
  9.  
    }
  10.  
    }
  11.  
     
  12.  
    // 不在同一个根目录下
  13.  
    if ($i==1) {
  14.  
    $return_path = array();
  15.  
    }
  16.  
     
  17.  
    // 在同一个根目录下
  18.  
    if ($i != 1 && $i < $len) {
  19.  
    $return_path = array_fill(0, $len - $i,"..");
  20.  
    }
  21.  
     
  22.  
    // 在同一个目录下
  23.  
    if ($i == $len) {
  24.  
    $return_path = array('./');
  25.  
    }
  26.  
     
  27.  
    $return_path = array_merge($return_path,array_slice($arr1,$i));
  28.  
    return implode('/',$return_path);
  29.  
    }
  30.  
     
  31.  
    $a = '/a/b/c/d/e.php';
  32.  
    $b = '/a/b/12/34/c.php';
  33.  
    $c = '/e/b/c/d/f.php';
  34.  
    $d = '/a/b/c/d/g.php';
  35.  
     
  36.  
    echo releative_path($a,$b);//结果是../../c/d
  37.  
    echo "<br />";
  38.  
    echo releative_path($a,$c);//结果是a/b/c/d
  39.  
    echo "<br />";
  40.  
    echo releative_path($a,$d);//结果是./
  41.  
    echo "<br />";
  42.  
    ?>

11.mysql_fetch_row()和mysql_fetch_array()有什么分别?

mysql_fetch_row()把数据库的一列储存在一个以零为基数的数组中,第一栏在数组的索引0,第二栏在索引1,依此类推。
mysql_fetch_assoc()把数据库的一列储存在一个关联数组中,数组的索引就是字段名称,例如我的数据库查询送回“first_name”、“last_name”、“email”三个字段,数组的索引便是“first_name”、“last_name”和“email”。
mysql_fetch_array()可以同时送回mysql_fetch_row()和mysql_fetch_assoc()的值。

12.有一个网页地址,比如PHP开发资源网主页:http://www.phpres.com/index.html,如何得到它的内容?

方法1(对于PHP5及更高版本):

  1.  
    $readcontents=fopen("http://www.phpres.com/index.html","rb");
  2.  
    $contents=stream_get_contents($readcontents);
  3.  
    fclose($readcontents);
  4.  
    echo $contents;

方法2:

echo file_get_contents("http://www.phpres.com/index.html");

13.谈谈对mvc的认识

由模型(model),视图(view),控制器(controller)完成的应用程序。
model层负责提供数据,和数据库有关的操作都交给模型层来处理,view层则提供交互的界面,并输出数据,而controller层则负责接收请求,并分发给相应的model来处理,然后调用view层来显示。

[!]14.What does the GD library do?(Yahoo)

GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。自从PHP 4.3.0版本后GD便内建在PHP系统中。

15.What function can you use to open a file for reading and writing?(Yahoo)

A.fget();
B.file_open();
C.fopen();
D.open_file();
答案:C
fget()这不是一个PHP函数,会引致执行错误。
file_open()这不是一个PHP函数,会引致执行错误。
fopen()这是正确答案,fopen()可以用来开启档案以便读写。
open_file()这不是一个PHP函数,会引致执行错误。

[!!]16.Smarty的原理

smarty是一个模板引擎,使用smarty主要是为了实现逻辑和外在内容的分离,如果不使用模板的话,通常的做法就是php代码和html代码混编。使用了模板之后,则可以将业务逻辑都放到php文件中,而负责显示内容的模板则放到html文件中。
Smarty在执行display方法的时候,读取模板文件,并进行数据替换,生成编译文件,之后每次访问都会直接访问编译文件,读取编译文件省去了读取模板文件,和字符串替换的时间,所以可以更快,编译文件里时间戳记录模板文件修改时间,如果模板被修改过就可以检测到,然后重新编译(编译是把静态内容保存起来,动态内容根据传入的参数不同而不同)。
如果启用了缓存,则会根据编译文件生成缓存文件,在访问的时候如果有缓存文件并且缓存文件没有过期,则直接访问缓存文件。

相关题目1:能够使HTML和PHP分离开使用的模板

smarty,phplib等

相关题目2:您是否用过模板引擎?如果有您用的模板引擎的名字是?

Smarty

17.PHP如何实现页面跳转

方法一:php函数跳转,缺点,header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。
header("Location:网址");//直接跳转
header("refresh:3;url=http://axgle.za.NET");//三秒后跳转

方法二:利用meta
echo"<meta http-equiv=refresh content='0;url=网址'>";

18.PHP可以和sql server/oracle等数据库连接吗?

可以

19.使用哪些工具进行版本控制?

SVN或者CVS

相关题目:您是否用过版本控制软件?如果有您用的版本控制软件的名字是?

TortoiseSVN-1.2.6

20.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):

过滤JavaScript脚本参考:

  1.  
    <?php
  2.  
    header("content-type:text/html;charset=utf-8");
  3.  
     
  4.  
    $script = "以下内容不显示:<script type='text/javascript'>alert('cc');</script>";
  5.  
    $pattern = '/<script[^>]*?>.*?</script>/si';
  6.  
     
  7.  
    echo preg_replace($pattern, "脚本内容", $script);//以下内容不显示:脚本内容
  8.  
    ?>

21.Given a line of text $string,how would you write a regular expression to strip all the HTML tags from it?(Yahoo)

方案一,使用PHP内建函数strip_tags()除去HTML标签
方案二,自定义函数,如下:

  1.  
    <?php
  2.  
    header("content-type:text/html;charset=utf-8");
  3.  
     
  4.  
    function strip_html_tags($str){
  5.  
    $pattern = '/<("[^"]*"|\'[^\']\*\'|[^>"\'])*>/';
  6.  
    return preg_replace($pattern,'',$str);
  7.  
    }
  8.  
     
  9.  
    // 实例
  10.  
    $html = '<p id="">ddddd<br /></p>';
  11.  
    echo strip_html_tags($html);
  12.  
    echo "<br />";
  13.  
     
  14.  
    $html = '<p id=">">bb<br />aaa<br /></p>';
  15.  
    echo strip_html_tags($html);
  16.  
    ?>

22.请写一个函数验证电子邮件的格式是否正确(要求使用正则)(新浪)

preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);

相关题目:请用正则表达式写一个函数,验证电子邮件的格式是否正确。(鑫众人云)

23.请对POSIX风格和兼容Perl风格两种正则表达式的主要函数进行类比说明(腾讯)

主要区别有以下三种:

  1. preg_replace()里面的正则可以写成型如:"/.xxx/"而ereg_replace()里面的正则需写成型如 "xxx"
  2. preg_replace()能操作数组,而ereg_replace()不可以
  3. 在逆向引用用preg_replace()可使用0-99个,而ereg_replace()最多为9个

使用Perl兼容正则表达式语法的preg_match()函数通常是比ereg()更快的替代方案。

24.请写出并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?(腾讯)

首先进入php安装目录
php -f d:/wamp/www/1.php 其中-f参数指定要执行的php文件
php -r phpinfo(); 其中-r表示直接执行php代码,无需写开始结束标记

25.使用正则表达式提取一段标识语言(html或xml)代码段中指定标签的指定属性值(需考虑属性值对不规则的情况,如大小写不敏感,属性名值与等号间有空格等)。此处假设需提取test标签的attr属性值,请自行构建包含该标签的串(腾讯)

编写如下函数:

  1.  
    <?php
  2.  
    header("content-type:text/html;charset=utf-8");
  3.  
     
  4.  
    function getAttrValue($str,$tagName,$attrName){
  5.  
    $pattern1="/<".$tagName."(\\s+\\w+\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\2))*\\s+".$attrName."\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\5)(\\s+\\w+\\s*=\\s*([\\'\\\"]?)([^\\'\\\"]*)(\\9))*\\s*>/i";
  6.  
     
  7.  
    $arr=array();
  8.  
    $re=preg_match($pattern1,$str,$arr);
  9.  
     
  10.  
    if($re){
  11.  
    echo"<br/>\$arr[6]={$arr[6]}";
  12.  
    }else{
  13.  
    echo"<br/>没找到。";
  14.  
    }
  15.  
    }
  16.  
     
  17.  
    // 示例
  18.  
    $str1="<test attr='ddd'>";
  19.  
    getAttrValue($str1,"test","attr");//找test标签中attr属性的值,结果为ddd
  20.  
    $str2="<test2 attr='ddd'attr2='ddd2't1=\"t1 value\"t2='t2 value'>";
  21.  
    getAttrValue($str2,"test2","t1");//找test2标签中t1属性的值,结果为t1 value
  22.  
    ?>

26.What does the following code do?Explain what's going on there.date=′08/26/2003′;printeregreplace(“([0−9]+)/([0−9]+)/([0−9]+)”,2/1/3,date);(Yahoo)

这是把一个日期从MM/DD/YYYY的格式转为DD/MM/YYYY格式。
输出26/08/2003

27.What function would you use to redirect the browser to a new page?(Yahoo)

A.redir()
B.header()
C.location()
D.redirect()
答案:B
redir()这不是一个PHP函数,会引致执行错误。
header()这个是正确答案,header()函数发送头信息,可以用来使浏览器转向到另一个页面,例如:header("Location:http://www.search-this.com/")。
location()这不是一个PHP函数,会引致执行错误。
redirect()这不是一个PHP函数,会引致执行错误。

28.When turned on____________will_________your script with different variables from
HTML forms and cookies.(腾讯)
A.show_errors,enable
B.show_errors,show
C.register_globals,enhance
D.register_globals,inject
答案:C

29.一个函数的参数不能是对变量的引用,除非在php.ini中把____设为on。
allow_call_time_pass_reference
是否启用在函数调用时强制参数被按照引用传递

30.在HTML语言中,页面头部的meta标记可以用来输出文件的编码格式,以下是一个标准的meta语句<META http-equiv='Content-Type'content='text/html;charset=gbk'>,请使用PHP语言写一个函数,把一个标准HTML页面���的类似meta标记中的charset部分值改为big5。(新浪)

请注意:
(1)需要处理完整的html页面,即不光此meta语句
(2)忽略大小写
(3)'和"在此处是可以互换的
(4)'Content-Type'两侧的引号是可以忽略的,但'text/html;charset=gbk'两侧的不行
(5)注意处理多余空格
编写正则表达式如下:
$reg1="/(<meta\\s*http-equiv\\s*=\\s*(['\"]?)Content-Type(\\2)\\s*content\\s*=\\s*(['\"])text\/html;charset=)(UTF-8)(\\4)(\\s*\/?>)/i";

31.PHP中如何判断一个字符串是否是合法的日期模式:2007-03-13 13:13:13。要求代码不超过5行。(酷讯)

  1.  
    <?php
  2.  
    function checkDateTime($data){
  3.  
    if (date('Y-m-d H:i:s',strtotime($data)) == $data) {
  4.  
    return true;
  5.  
    } else {
  6.  
    return false;
  7.  
    }
  8.  
    }
  9.  
     
  10.  
    // 示例
  11.  
    $data = '2015-06-20 13:35:42';
  12.  
    var_dump(checkDateTime($data));//bool(true)
  13.  
     
  14.  
    $data = '2015-06-36 13:35:42';
  15.  
    var_dump(checkDateTime($data));//bool(false)
  16.  
    ?>

32.PHP中,如何获得一个数组的键值?(酷讯)

使用key()可以获得数组中当前元素的键名,使用current()则可以返回当前元素的值。
使用array_keys()则可以得到数组中所有的键名。
使用foreach结构foreach($arr as key=>value)可以通过key和value分别获取键名和值。

33.如果模板是用smarty模板。怎样用section语句来显示一个名为$data的组。比如:

  1.  
    $data=array(
  2.  
    0=>array('id'=>8,'name'=>'name1'),
  3.  
    1=>array('id'=>10,'name'=>'name2'),
  4.  
    2=>array('id'=>15,'name'=>'name3')
  5.  
    );

写出在模板页的代码?若用foreach语句又要怎样显示呢?

用section语句:

  1.  
    <{section name=test loop=$data start=0 step=1}>
  2.  
    id:<{$data[test].id}><br/>
  3.  
    name:<{$data[test].name}><br/><br/>
  4.  
    <{sectionelse}>
  5.  
    数组为空
  6.  
    <{/section}>

用foreach语句:

  1.  
    <{foreach from=$data item=test}>
  2.  
    id:<{$test.id}><br/>
  3.  
    name:<{$test.name}><br/><br/>
  4.  
    <{foreachelse}>
  5.  
    数组为空
  6.  
    <{/foreach}>

34.哪个选项会匹配下边的这个正则表达式?(/.*xyz\d/)
A.*****xyz

B.*****xyz1
C.******xyz2
D.*xyz
答案:C

35.以下哪个错误无法被标准的错误控制器获取?

A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:B

36.以下哪种错误类型无法被自定义的错误处理器捕捉到?(奇矩互动)

A.E_WARNING
B.E_USER_ERROR
C.E_PARSE
D.E_NOTICE
答案:C

37.(^\s)|(\s$)这个正则表达式作用是:__________;

匹配以0个或多个空白符开头或者0个或多个空白符结尾的字符串

38.编写函数取得上一月的最后一天

  1.  
    <?php
  2.  
    date_default_timezone_set('PRC');
  3.  
     
  4.  
    /**
  5.  
    * 获取给定月份的上一月最后一天
  6.  
    * @param $date string 给定日期
  7.  
    * @return string 上一月最后一天
  8.  
    */
  9.  
    function get_last_month_last_day($date = ''){
  10.  
    if ($date != '') {
  11.