第22课:PHP常用经典面试题含答案

下面给出一些常用的PHP的面试题,希望在求职过程中能够给你带来帮助,也希望能给那些面试别人的大神带来点思路

1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量$_SERVER['PHP_SELF']中;而链接到当前页面的URL记录在预定义变量$_SERVER["HTTP_REFERER"]中
获取完整URL: echo 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
获取IP地址 $_SERVER['REMOTE_ADDR']

2.在HTTP 1.0中,状态码401的含义是未授权;如果返回"找不到文件"的提示,则可用 header 函数,其语句为header("HTTP/1.0 404 Not Found")。
304 - 未修改
200 - 服务器成功返回网页
404 - 请求的网页不存在
503 - 服务器超时

3.数组函数 arsort 的作用是对数组进行逆向排序并保持索引关系;语句 error_reporting(2047)的作用是All errors and warnings

4.写出一个正则表达式,过虑网页上的所有JS/VBS脚本
/<[^>].*?>.*?<\/>/si

5.语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是发生异常时include产生警告require产生致命错误;为了避免多次包含同一文件,可以用语句require_once()/include_once()来代替它们

6.用PHP打印出前一天的时间格式是2006-5-10 22:21:21
echo date('Y-m-d H:i:s', strtotime('-1 day'));

求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数 
(strtotime('2007-3-6')-strtotime('2007-2-5'))/3600*24

7.echo(),print(),print_r()的区别
echo是语言结构,无返回值;print功能和echo基本相同,不同的是print是函数,有返回值;print_r是递归打印,用于输出数组对象

8.如何实现字符串翻转?
用strrev函数呗,不准用PHP内置的就自己写
function strrev($str) {
    $len = strlen($str);
    $newstr = '';
    for($i = $len - 1; $i >= 0; $i--) {
        $newstr .= $str[$i];
    }
    return $newstr;
}

9.实现中文字串截取无乱码的方法
mb_substr()

10.类的初始化与方法调用方式
$test = new Test();
$result = $test->getTest(2);

11.获取文件扩展名
pathinfo($file, PATHINFO_EXTENSION);

12.如何修改SESSION的生存时间
session_set_cookie_params()来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用

13.请写一段 PHP 代码 ,确保多个进程同时写入同一个文件 成功
function writeFile($filename, $content) {
    $lock = $filename . '.lck';
    $write_length = 0;
    while(true) {
        if( file_exists($lock) ) {
            usleep(100);
        } else {
            touch($lock);
            $write_length = file_put_contents($filename, $content, FILE_APPEND);
            break;
        }
    }
    if( file_exists($lock) ) {
        unlink($lock);
    }
    return $write_length;
}

14.请简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析
用explain来分析优化sql语句
优化方法:
选择最有效率的表名顺序
WHERE子句中的连接顺序
SELECT子句中避免使用'*'
通过内部函数提高SQL效率
避免在索引列上使用计算
提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉
根据需要使用不同的存储引擎

15.mysql_fetch_row() 和 mysql_fetch_array() 有什么分别
mysql_fetch_row() 把数据库的一列储存在一个以零为基数的阵列中,第一栏在阵列的索引 0,第二栏在索引 1,如此类推。mysql_fetch_assoc() 把数据库的一列储存在一个关联阵列中,阵列的索引就是栏位名称

16.$date='08/26/2003';print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)","\\2/\\1/\\3",$date);代码用来做什么?
这是把一个日期从 MM/DD/YYYY 的格式转为 DD/MM/YYYY 格式

17.GD函式库用来做什么
处理和显示各式格式的图片,它的另一个常见用途是制作图片。GD以外的另一个选择是 ImageMagick,但这个函式库并不内建于 PHP 之中,是一个专门处理图片的PHP扩展

18.请举例说明在你的开发过程中用什么方法来加快页面的加载速度
静态文件缓存
要用到服务器资源时才打开,及时关闭服务器资源,只返回必要的数据,尽量减少数据传输
数据库添加索引
页面可生成静态
图片等大文件单独服务器
使用代码优化工具啦
使用redis等nosql来减少db查询
web服务器读写分离,数据库读写分离,缓存读写分离

19.防止SQL注射漏洞一般用addslashes函数和mysql_real_escape_string
不过更好的方式是用pdo绑定参数操作数据库,无法绑定的参数用addslashes处理

20.PHP中传值和传引用、传地址的区别是什么?
传值是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 
传地址 是传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象

21.如何通过javascript判断一个窗口是否已经被屏蔽
获取open()的返回值,如果是null,就是屏蔽了

22.对于大流量的网站,您采用什么样的方法来解决访问量问题
1.确认服务器硬件是否足够支持当前的流量
2.优化数据库访问。
3.禁止外部的盗链。
4.控制大文件的下载。
5.使用不同主机分流主要流量,读写分离
6.使用流量分析统计软件
7.静态文件缓存
8.数据nosql缓存,减少db查询

23简述下面程序的输出结果, 简要说明为什么, 如何解决这类问题?
<?php
$tmp = 0 == "a" ? 1: 2;
echo $tmp;
?>

结果 1 int和string类型强制转换造成的,应该用0 === "a" 

24.将下面的数组用一行拼装成一个字符串i am milo! day day up!
<?php
$arr = array(
'I', 'AM', 'MILO!', 'DAY', 'DAY', 'UP!'
);
?> 

$str = strtolower(implode(" ", $arr)); 

25.用原生态mysql扩展去连接并查询user表的前十行 
$link = mysql_connect("192.168.0.254:3306","one","piece") or die('Could not connect: '.mysql_error());
mysql_select_db('db_user',$link);
$query = mysql_query("select * from user limit 10");
while($rs = mysql_fetch_array($query,MYSQL_ASSOC))
{}

26.用autoload($class) 实现Lib目录下的类的自动加载并可以兼容子目录 
function __autoload_my_classes($classname) {
    # ... your logic to include classes here
}
spl_autoload_register('__autoload_my_classes'); 

27.下面php程序输出的内容是什么? 为什么?
<?php
$str = "aa\tbb\tcc";
@list($a, $b, $c) = explode('\t', $str);
echo $a,$b,$c;
?>


aabbcc;//'\t'不会以\t切割字符串,explode之后申城一个array(0=>"aa\tbb\tcc")所以。。。,'\t'换成"\t"就被切割


28.现有一个函数, 有不确定多少个的参数(可能有5个也可能有50个), 如何去定义这个函数
function param()
{
	$numargs = func_num_args();
	echo "Number of arguments: $numargs<br />\n";
	if ($numargs >= 2) {
	    echo "Second argument is: " . func_get_arg(1) . "<br />\n";
	}
	$arg_list = func_get_args();
	for ($i = 0; $i < $numargs; $i++) {
	    echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
	}
}
param(1,2,3,4,5); 

29.call_user_func_array用法
<?php
function test($arg, $arg2, $arg3)
{
   echo $arg;
}
test('hi', 'my', 'name'); 
class xxx{
    static function test2() {
        print_r(func_get_args());
    }
}
\\\\\\
call_user_func_array(func_name, args)
test2()			=>	'test2'
xxx::test2();		=>	array('xxx', 'test2')
$xxx->test2();		=>	array($xxx, 'test2')
$abc->xxx()->test2()	=>	array($abc->xxx(), 'test2')
\\\\\\
xxx::test2();
call_user_func('test', 'hi', 'my', 'name')
call_user_func_array(func_name, args)
call_user_func_array(array('xxx', 'test2'), array('hi', 'my', 'name'));
?>

30.在一个函数(该函数没有return语句)里面去处理全局变量, 并且改变他的值, 用两种方法去实现(global和引用&) 
$var = 1;
function getPra() {
    global $var;
    $var = 'xxx';
    echo $var;
}
echo $var . '--';
getPra();
echo $var; 
-------------
$test = 1;
$test1 = 2;
function getPra() {
    global $test1;
    $GLOBALS["test"] = &$test1;
}
echo $test . "\n";
getPra();
echo $test;

31.简述队列, 堆栈的原理
都可以看做是一维数组来操作,队列先进先出,出列只能在列头,进列只能在列尾,堆栈是后进先出,进栈和出栈都是从栈顶

32.例如google,baidu等大型网站,当使用不同客户端(如手机和PC机)访问同样的URL时,呈现的页面却不相同,这是何原理?
简单的可以用user_agent判断

33.使用哪些工具进行版本控制?
svn,git,cvs

34.计算程序运行时间
$t1 = microtime(true);
//执行代码
$t2 = microtime(true);
echo '耗时'.round($t2-$t1,3).'秒';

35.XML处理怎么返回数组
xml_to_array($xml);

36.php读取目录及子目录下所有文件名的方法
$dir = "./godeye/";
$file = scandir($dir);
print_r($file);

37.用 PHP 实现一个双向队列
class DEQueue {
    //存储
    protected $_storage = array();
    
    //入头
    public function unshift($element)
    {
        return array_unshift($this->_storage, $element);
    }
    
    //入尾
    public function push($element)
    {
        return array_push($this->_storage, $element);
    }
    
    //出尾
    public function pop()
    {
        return array_pop($this->_storage);
    }
    
    //出头
    public function shift()
    {
        return array_shift($this->_storage);
    }
    
    //长度
    public function length()
    {
        return count($this->_storage);
    }
}

38.列出5个以上PHP的超级变量
$_GET $_POST $_REQUEST $_COOKIE $_SESSION $_SERVER

打赏  如对你有帮助,请我喝杯咖啡吧!