PHP初级面试题整理

 更新时间:2016年11月25日 15:41  点击:2266
今天看到一份PHP初级面试题给大家分享下,好像挺逗比的。其实自己也挺头疼面试的,老是搞那种理论。习惯百度谷歌的人,真想回答句自己百度去。


一、前端部分

Firefox和google浏览器使用的引擎是什么?(前段最起码最起码的基础,调流浏览器兼容性必知。也是使用CSS3和HTML5是必知)
Firefox 使用的是 Gecko,而 Safari 和 Chrome 浏览器使用的都是 Webkit。最新版的opera也使用了webkit
 
如何用CSS实现水平居中和垂直居中?(基础的基础)
水平居中:text-align:center;margin:0 auto
垂直居中:可以将容器设置为display:table,然后将子元素也就是要垂直居中显示的元素设置为display:table-cell,然后加上vertical-align:middle来实现。或者使用{top:50%;transform: translateY(-50%);}
以上都是不完美实现,但都是基础。根本没思路的是骗子。
 
如何处理jQuery冲突?(基础的基础)
jQuery.noConflict(); 或者用闭包
(function($){})(jQuery);
 
二、数据存储部分
怎样定位MySQL中效率较低的语句?
使用show full processlist和慢查询日志。
 
数据库的增量备份主从服务做过没?
关键点在binlog,也就是二进制日志。
 
MYISAM引擎和INNODB引擎的对比?
关键点:表锁行锁,是否支持事务,索引的存储,适用场景
 
如果面试者简历中提到了熟悉memcache,那么就问:memcache的默认端口是啥?Value的最大长度是啥?默认的缓存有效期是多久?
答案:端口:11211 ,value最大1M,有效期30天。这三个问题有两个回答错的就是骗子。
如果提到redis,就问redis的最大value值是多少?存储有序和无序集合用哪种数据类型?哪个命令发起事务?哪两种持久化方式?
答案:value最大512M,有序用list和sorted set,无序用 set;发起事务用multi;持久化方式为内存快照和日志追加。
 
PHP部分:

类的自动加载怎么实现?
spl_autoload_register,回答__autoload 的是没做过,人云亦云的瞎扯。
 
列举几个PHP的魔术方法?
__set(),__get(),__construct(),__call(),__toString()。一共有14,5个,回答不出4个的说熟悉面向对象是在瞎扯。
 
正则表达式只能怪不区分大小写的修饰符是哪个?不用正则如何判断email格式是否正确?
答案:i;使用filter系列函数,如果能输出这个系列函数的缺陷更佳。
 
4.MVC的基本流程,每层都干些什么?自己是否实现过MVC框架?
 
 
服务器及其它

linux中类似win的资源管理器命令是哪个?怎样查看开机自启动有哪些服务?计划任务是哪个服务实现?删除非空文件夹用什么命令?
答案:top;chkconfig –list;crontab;rm -r;
 
平常经常去的技术社区。

再附一款


* 1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中;而链接到当前页面的URL记录在预定义变量(2)中。
2.执行程序段<?php echo 8%(-2) ?>将输出(3)。
3.在HTTP 1.0中,状态码 401 的含义是(4);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(5)。
4.数组函数 arsort 的作用是(6);语句 error_reporting(2047)的作用是(7)。
5.PEAR中的数据库连接字符串格式是(8)。
6.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):(9)。
7.以Apache模块的方式安装PHP,在文件http.conf中首先要用语句(10)动态装载PHP模块,
然后再用语句(11)使得Apache把所有扩展名为php的文件都作为PHP脚本处理。
8.语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是(12);为了避免多次包含同一文件,可以用语句(13)来代替它们。
9.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是(14)。
10.一个函数的参数不能是对变量的引用,除非在php.ini中把(15)设为on.
11.SQL 中LEFT JOIN的含义是(16)。
如果 tbl_user记录了学生的姓名(name)和学号(ID),
tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和考试成绩(score)以及考试科目(subject),
要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句(17)。

12.在PHP中,heredoc是一种特殊的字符串,它的结束标志必须(18)。

 

13.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
14.简述论坛中无限分类的实现原理。
15.设计一个网页,使得打开它时弹出一个全屏的窗口,该窗口中有一个文本框和一个按钮。用户在文本框中输入信息后点击按钮就可以把窗口关闭,而输入的信息却在主网页中显示。

//答案(填空):

1. echo $_SERVER['PHP_SELF']; echo $_SERVER["HTTP_REFERER"];
2. 0
3. (4)未授权 (5) header("HTTP/1.0 404 Not Found");
4. (6)对数组进行逆向排序并保持索引关系    (7)All errors and warnings
5. 没弄明白
6. /<script[^>].*?>.*?</script>/si
7.(10)    LoadModule      php5_module "D:/xampp/apache/bin/php5apache2.dll"
 
     (11) AddType application/x-httpd-php-source .phps
        AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml
8.(12) 发生异常时include产生警告require产生致命错误    (13) require_once()/include_once()
9. serialize() /unserialize()
10. allow_call_time_pass_reference
11. (16) 自然左外连接
       (17) select name , count(score) as sum_score from tbl_user left join tbl_score on tbl_user.ID=tbl_score.ID    group by tbl_user.ID
12. 结束标识符所在的行不能包含任何其它字符除";"

 

13.

/**
* 遍历目录,结果存入数组。支持php4及以上。php5以后可用scandir()函数代替while循环。
* @param string $dir
* @return array
*/
function my_scandir($dir)
{
     $files = array();
     if ( $handle = opendir($dir) ) {
         while ( ($file = readdir($handle)) !== false ) {
             if ( $file != ".." && $file != "." ) {
                 if ( is_dir($dir . "/" . $file) ) {
                     $files[$file] = rec_scandir($dir . "/" . $file);
                 }else {
                     $files[] = $file;
                 }
             }
         }
         closedir($handle);
         return $files;
     }
}

phpmailer是一款免费的php邮件发送插件,我们可以利用phpmailer登录到我们指定的邮件然后再利用这个邮件给我们自动发邮件了,这个现在免费的邮箱像163,sina都支持,只是sina需要简单的打开pop3协义了,好了费话不说多了来看看一段phpmainer 163邮件发送邮件吧。

注意:如果你的服务器安装了卖咖啡并且开户病毒最大防护功能我们需要关闭一个邮件防护哦,否则你的邮件发不出去给被这款杀毒给拦截哦。

1. 使用gmail发送的脚本

 代码如下 复制代码
include("class.phpmailer.php");
include("class.smtp.php");
//获取一个外部文件的内容
$mail             = new PHPMailer();
$body             = file_get_contents('contents.html');
$body             = eregi_replace("[]",'',$body);
//设置smtp参数
$mail->IsSMTP();
$mail->SMTPAuth   = true;
$mail->SMTPKeepAlive = true;
$mail->SMTPSecure = "ssl";
$mail->Host       = "smtp.gmail.com";
$mail->Port       = 465;
//填写你的gmail账号和密码
$mail->Username   = "yourname@gmail.com";
$mail->Password   = "password";
//设置发送方,最好不要伪造地址
$mail->From       = "yourname@gmail.com";
$mail->FromName   = "Webmaster";
$mail->Subject    = "This is the subject";
$mail->AltBody    = $body;
$mail->WordWrap   = 50; // set word wrap
$mail->MsgHTML($body);
//设置回复地址
$mail->AddReplyTo("yourname@gmail.com","Webmaster");
//添加附件,此处附件与脚本位于相同目录下
//否则填写完整路径
$mail->AddAttachment("attachment.jpg");
$mail->AddAttachment("attachment.zip");
//设置邮件接收方的邮箱和姓名
$mail->AddAddress("toname@gmail.com","FirstName LastName");
//使用HTML格式发送邮件
$mail->IsHTML(true);
//通过Send方法发送邮件
//根据发送结果做相应处理
if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  echo "Message has been sent";
}

2.使用163发送邮件的脚本

只需要更改SMTP配置和账户密码即可,SMTP配置如下

 代码如下 复制代码

//设置smtp参数
//注意这里不需要ssl协议
$mail->IsSMTP();
$mail->SMTPAuth   = true;
$mail->SMTPKeepAlive = true;
$mail->Host       = "smtp.163.com";
$mail->Port       = 25;

在本地wampserver环境下测试通过,需要开启php_openssl 扩展。

经验分享

有一些朋友参考此教程来使用sina邮件登录发送邮件时你发现新浪邮件并不支持这个功能,其实这个并不是新浪邮箱不支持此功能我们需要在新浪邮箱中找开pop3这个协议才可以,开户方法是登录新浪之后,我们在右边的更多旁边有一个设置按钮,我们点击进入之后会看到有个“帐户设置”进入之后在最下面有一个pop3协义类的我们可以把它开户,这样你再试一下上面代码就可以解决了哦,有朋友部为什么163邮件不用设置呢,因为163邮件默认是打开pop3的哦。

strtotime函数在是大家常用的一个时间日期转换成单位S的一个函数了,但是这个函数有一个细节大家可能没有注意到,就是 使用的时候需要考虑 有31天和 2月份的情况,所以,如果没有考虑这个特殊的情况,那么在每月的31号或者和2月份有关的时间点时候就可能出现开始的那个灵异情况了,这个情况很多朋友都不记得了,但在很多时间这个非常重要,下面举例子来给各位介绍一下。

今天在微博上看到一个小案例,命令行如下:

 代码如下 复制代码

php -r “echo date(‘Y/m’,strtotime(‘-2 months’)) . \”\n\”;”

输出结果如下:

2013/03

如果把命令行修改成如下:

 代码如下 复制代码

php -r “echo date(‘Y/m’,strtotime(‘-3 months’)) . \”\n\”;”

输出结果如下:

2013/03

这里就奇怪了,怎么两个月前和三个月前的年月份都是一样的,再看看下面的命令行:

 代码如下 复制代码

php -r “echo date(‘Y/m’,strtotime(‘-3 months’,strtotime(’2013/05/28′))) . \”\n\”;”

输出结果如下:

2013/02

如果修改命令行为如下:

 代码如下 复制代码

php -r “echo date(‘Y/m’,strtotime(‘-3 months’,strtotime(’2013/05/29′))) . \”\n\”;”

输出结果如下:

2013/03

下面这个与预期的结果是一样的,现在说说为什么会出现开始的那个奇怪的坑。

strtotime里的months和 month是30天,使用的时候需要考虑 有31天和 2月份的情况,所以,如果没有考虑这个特殊的情况,那么在每月的31号或者和2月份有关的时间点时候就可能出现开始的那个灵异情况,这个算是strtotime的一个坑吧,为了慎重起见,能不用的时候就尽量别去用这个坑人的东东。

PS:以上所有例子都是在Debian6的64位系统下执行,使用命令行方式执行,执行时间是2013-05-30.

上月下月时间不准确


以下有几种方法,可以帮助我们达到预期效果,比如我要返回上个月的月份:

 代码如下 复制代码
echo date('M Y', strtotime('midnight first day of -1 month'));
或者:
echo date('M Y', strtotime(date('Y-m-01')) - 86400);

下方是其他的用途:

 代码如下 复制代码

strtotime('first day of last month');
strtotime('last day of last month');
strtotime('first of last week');
strtotime('first of this week');
strtotime('this week midnight'); // returns Monday midnight of this week
strtotime('last week midnight'); // returns Monday midnight of last week
strtotime('last week Sunday midnight'); // returns Sunday midnight of this week
strtotime('-2 weeks Sunday midnight'); // returns Sunday midnight of last week

<?php
date_default_timezone_set('Asia/Shanghai');
$first_day_of_month = date('Y-m',time()) . '-01 00:00:01';
$t = strtotime($first_day_of_month);
print_r(array(

date('Y年m月',$t),
date('Y年m月',strtotime('- 1 month',$t)),
date('Y年m月',strtotime('- 2 month',$t)),
));
?>

下面我来给大家转一个关于Laravel4创建一个占位图片服务例子,有需要了解的朋友可看看。

使用Composer安装intervention/image库

 代码如下 复制代码
composer require intervention/image:dev-master

编码

 代码如下 复制代码

// vim app/routes.php
<?php
Route::pattern('width', '\d+');
Route::pattern('height', '\d+');
Route::get('{width}x{height}', 'ImageHolderController@getIndex');
// vim app/controllers/ImageHolderController.php
<?php

class ImageHolderController extends BaseController {
    public function getIndex($width, $height)
    {
        $width = intval($width);
        $height = intval($height);
        if ($width > 1900 || $height > 900)
            App::abort(404);
        $fontSize = min(max(intval($width / 5), 12), 38);
        $image = Image::canvas($width, $height, '#CCCCCC')
                ->line('#B5B5B5', 0, 0, $width, $height)
                ->line('#B5B5B5', $width, 0, 0, $height)
                ->text($width . 'x' . $height, $width / 2, $height / 2, function ($font) use ($fontSize) {
                    $font->file(public_path('font/Georgia.ttf'));
                    $font->align('center');
                    $font->valign('middle');
                    $font->size($fontSize);
                    $font->color('#666666');
                });
        return Response::make($image, 200, array('Content-Type' => 'image/png'));
    }
}

公司的服务器用的是wdcp搭建的环境,安装非常方便,但是在开发的过程可能把函数名之内的东西写错了,服务器直接返回的是500错误,没有任何错误提示,只是告诉你500错误,很让人头疼,这样调试错误很不方便,注意这里我关掉了浏览器的显示 友好错误

这个时候我们需要修改php.ini配置文件,不知道配置文件在那里,请用phpinfo() 然后搜索一下php.ini,你就能看到php.ini的位置了

查找:display_errors 将值设置成on

 代码如下 复制代码

display_errors = on

error_reporting = E_ALL & ~E_DEPRECATED

如果我们在php.ini中打开了错误提示还是不行你的程序可能有错误开关了,如下

 代码如下 复制代码

<?php
//禁用错误报告 
error_reporting(0); 
//报告运行时错误 
error_reporting(E_ERROR | E_WARNING | E_PARSE); 
//报告所有错误 
error_reporting(E_ALL); 
?>

如果你程序中有这段代码我们只要去掉就可以了哦

PHP NOTICE级错误提示对程序性能影响的研究

 

下面我来用性能测试来证明这个推论:
测试1:
在关闭错误显示的情况下,测试未初始化变量和已初始化变量在10000000次循环中的性能
变量已初始化的循环代码如下:
点击查看原图
变量未初始化的循环代码如下:
点击查看原图
测试成绩:
初始化:平均 5.28 秒
未初始化:平均 17.2 秒
性能差距:3.25倍
 
测试2:
在关闭错误显示的情况下,测试数组索引使用引号和非引号引用在10000000次循环中的性能
数组有引号索引代码如下:
点击查看原图
数组无引号索引代码如下:
点击查看原图
测试成绩:
有引号:平均 6.37 秒
无引号:平均 25.19秒
性能差距:3.95倍
平均时间表:
点击查看原图
结论:
从上面例子可以看出如果页面错误太多会导致页面性能下降哦,所以我们尽量不要使用关闭错误来处理php错误问题我们要保证页面没有错误才行哦。
[!--infotagslink--]

相关文章

  • Bootstrap Table使用整理(二)

    这篇文章主要介绍了Bootstrap Table使用整理(二)的相关资料,需要的朋友可以参考下...2017-06-15
  • 7道关于JS this的面试题,你能答对几个

    这篇文章主要给大家介绍了7道关于JS this的面试题,来看看你能答对几个,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-05
  • file_put_contents并发性问题解决方案整理

    在使用file_put_contents时会碰到并发性问题了,对于这个问题我们有多种解决方案了,其实锁是小编比较喜欢的解决办法了,当然也有其它办法,具体如下。 解决 办法一,fil...2016-11-25
  • 硬核 Redis 高频面试题解析

    Redis 是一个高性能的key-value数据库。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端使用很方便...2021-06-17
  • web面试MVC与MVVM区别及Vue为什么不完全遵守MVVM解答

    这篇文章主要介绍了web面试中常问问题,MVC与MVVM区别以及Vue为什么不完全遵守MVVM的难点解答,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-09-24
  • 解答“60k”大佬的19道C#面试题(上)

    这篇文章主要解答了“60k”大佬的19道C#面试题中的10道,文中的面试题比较小众,作者给了不错的答案,相信对你以后的面试有所帮助,感兴趣就来了解下...2020-06-25
  • Bootstrap Table使用整理(一)

    基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选、多选、排序、分页,以及编辑、导出、过滤(扩展)等等的功能...2017-06-15
  • jqGrid 学习笔记整理——进阶篇(一 )

    这篇文章主要介绍了jqGrid 学习笔记整理——进阶篇(一 )的相关资料,需要的朋友可以参考下...2016-04-19
  • Java面试题冲刺第十五天--设计模式

    这篇文章主要为大家分享了最有价值的三道关于设计模式的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下...2021-08-07
  • PHP面试题:$a+$a++ 与 $a+$a+$a++

    $a+$a++ 与 $a+$a+$a++的结果是多少,这个对于很多程序员来讲几乎是都会做错的,那么$a+$a++ 与 $a+$a+$a++最后会是什么结果?下面我们一起来看看吧。 让我们来先看一...2016-11-25
  • C#中try...catch的使用与常见面试题分享

    这篇文章首先给大家介绍了关于C#中try...catch的语法,而后又给大家分享了关于C#中try...catch最常见的面试题,具有一定的参考借鉴价值,需要的朋友们下面来一起看看吧。...2020-06-25
  • PHP初级面试题整理

    今天看到一份PHP初级面试题给大家分享下,好像挺逗比的。其实自己也挺头疼面试的,老是搞那种理论。习惯百度谷歌的人,真想回答句自己百度去。 一、前端部分 Firefox...2016-11-25
  • php 文件系统函数整理介绍

    本文章来给各位同学介绍一下关于一些常用的php 文件系统函数整理,希望这些东西对各位同学会有所帮助哦。 简介:本次介绍的是PHP中与文件操作相关的系统函数,这些...2016-11-25
  • PHP面试中常见的面试试题与算法例子

    本文章整理的PHP面试题目主要从两个方法来做,一个是字符串与文件的操作例子,另一个是常用的几种排序算法的例子,下面一起来看看。 下面是四道比较常见的题目,主要考察...2016-11-25
  • 华为面试题数字大小写转换

    一个四位数,如1024,1004,打印出他们的中文形式,如果一千零二十四,一千零四,大家参考使用吧...2020-04-25
  • 一道常被人轻视的web前端常见面试题(JS)

    面试题是招聘公司和开发者都非常关心的话题,公司希望通过它了解开发者的真实水平和细节处理能力,而开发者希望能够最大程度地展示自己的水平(甚至超常发挥)。本文提供了众多前端开发面试题,无论是招聘方还是应聘方都值得一看...2016-02-18
  • java关于string最常出现的面试题整理

    在本篇文章里小编给大家整理的是一篇关于java关于string最常出现的面试题整理内容,有兴趣的朋友们可以参考下。...2021-01-18
  • C# 超高面试题收集整理

    C# 超高面试题,学习c sharp的朋友可以看下,有说明地方的不足。是不是所有问题都有自己的解决方法。...2020-06-25
  • PHP运行符优先级的面试题

    优先级通常是讲运行算了,在php中各种运算符是非常的多了,在这里我就来为各位整理一份面试公司可能会常出的优先级例子,具体如下。 先看看题目 echo '1'.print(2)+3...2016-11-25
  • Java面试题冲刺第二十八天--数据库(5)

    这篇文章主要为大家分享了最有价值的三道关于数据库的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下...2021-09-02