您的位置:首页 > 职场人生

php面试题汇总

2017-02-09 20:01 295 查看
1.nginx使用哪种网络协议?

nginx是应用层 我觉得从下往上的话 传输层用的是tcp/ip 应用层用的是http

fastcgi负责调度进程

2. <? echo 'hello tusheng' ; ?> 没有输出结果, 可能是什么原因, 简述的解决此问题的过程(提示: 语法没有问题)

可能服务器上面没有开启短标签short_open_tag =设置为Off,,php.ini开启短标签控制参数: short_open_tag = On

3. 简述下面程序的输出结果, 简要说明为什么, 如何解决这类问题?

<?php

$tmp = 0 == "a"? 1: 2;

echo $tmp;

?>

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

0 == 0 肯定是true啊

PHP是弱类型。。

$tmp = 0 === "a"? 1: 2;

echo $tmp; 这样就是2

4. 已知一个字符串如下: $str = "1109063 milo 1";

用一行代码将该字符串里面的1109063赋值给$uid, milo赋值给$user, 1赋值给$type

空格如下

list($uid, $user, $type) = explode(" ", $str);

\t如下

list($uid, $user, $type) = explode("\t", $str);

list($uid, $user, $type) = sscanf($str, "%d %s %d");

$n = sscanf($auth, "%d\t%s %s", $id, $first, $last);

5. 分别列出如下类型的有符号和无符号范围 TINYINT SMALLINT MEDIUMINT INT

TINYINT-2^7 - 2^7-10 ~ 2^8-1

SMALLINT-2^15 - 2^15-1 0 ~ 2^16-1

MEDIUMINT-2^23 - 2^23-1 0 ~ 2^24-1

INT-2^31 - 2^31-1 0 ~ 2^32-1

6. 将下面的数组用一行拼装成一个字符串i am milo! day day up!

<?php

$arr = array(

'I', 'AM', 'MILO!', 'DAY', 'DAY', 'UP!'

);

?>

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

7. 调用如下函数获取函数并获取count的值

<?php

function get_list($cnd = array(), &$count = false)

{

// 伪代码 处理$cnd 并赋值datas

$datas = 'i am call back';

$count && $count = rand(1, 10000);

return $datas;

}

?>

$count=1;

$data = get_list($cnd,&$count);

echo $count;

8. 几种方式去取代session机制, 简单描述各自的优劣

mysql、memcache、cookie保持一种唯一状态标识码

9. 下列HTTP状态码出现的可能原因, 如何处理

200, 301, 404, 502, 503

200

  请求已成功,请求所希望的响应头或数据体将随此响应返回。

301

  被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。   新的永久性的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   如果这不是一个 GET 或者 HEAD 请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
  注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET 方式。

404

  请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。

502

  作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

503

  由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。   注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。

200 OK 一切正常,对GET和POST请求的应答文档跟在后面。

301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL

404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。

502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。

10. 有如下数据库, 用原生态mysql扩展去连接并查询user表的前十行

host: 192.168.0.254

port: 3306

user: one

pass: piece

database: db_user

table: 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))

{}

11. 用autoload($class) 实现Lib目录下的类的自动加载并可以兼容子目录

$request->action = lcfirst(implode(array_map(

'ucfirst',

explode('-', strtolower($request->action))

)));

------------------------------------------------------------

function __autoload($class)

{

$cls = strtolower(str_replace("_","/",$class));

if(file_exsits(LIB.$cls.'.php'))

{

include_once(LIB.$cls.'.php');

}

else

{

die("not found {$class} class");

}

}

defined("LIB",'/data/wwwroot/www.xx.com/lib/');

$author = new Lib_Author();

-----------------------------------------------------------

function __authload($class)

{

$cls = explode("_",$class);

if(@is_dir($cls[1]))

{

if(@is_file($cls[2]))

{

include_once("CON_PATH".$cls[1].'/'.$cls[2].".php");

}

else

{

dir('error');

}

}

else if(@is_file($cls[1].".php"))

{

include_once("CON_PATH".$cls[1].".php");

}

else

{

dir('error');

}

}

---------------------------------------

function __autoload($class)

{

$cls = explode("_",$class);

$file = get_file($cls);

if($file=='error')

{

die('error');

}

include_once($file);

}

function get_file($dir)

{

if(is_array($dir))

{

foreach($dir as $k=>$v)

{

$tmpdir .= $v.'/';

if(is_dir('CON_PATH'.$tmpdir))

{

continue();

}

else if(is_file('CON_PATH'.$tmpdir.".php"))

{

return 'CON_PATH'.$tmpdir.".php";

}

else

{

return 'error';

}

}

return 'error';

}

return 'error';

}

defined("CON_PATH","/data/wwwroot/www.xx.com/app/cntroller/");

$sb = new controller_sb();

------------------------------------

function __autoload_my_classes($classname)

{

# ... your logic to include classes here

}

spl_autoload_register('__autoload_my_classes');

-----------------------------------------------------------

12. 用set_error_handle 去捕获错误并输出, 级别自己定

set_error_handle(callback,level)

function callback(int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ){

}

function dealErrorHandler($errno,$errstr,$errfile,$errline)

{

switch($errno){

case E_USER_ERROR:

echo "error [$errno] $errstr fatal error on line $errline in file $errfile";

break;

case E_USER_WARNING:

echo "my warning [$errno] $errstr":

break;

case E_USER_NOTICE:

echo "my notice[$errno] $errstr";

break;

default:

echo "unkonwn error type :[$errno] $errstr";

break;

}

}

set_erro_handler(dealErrorHandler);

trigger_error("notice", E_USER_NOTICE);

trigger_error("warning", E_USER_WARNING);

trigger_error("error", E_USER_ERROR);

13. 简述两种屏蔽php程序的notice警告的方法

初始化变量,文件开始设置错误级别或者修改php.ini 设置error_reporting

set_error_handler 和 @抑制错误

1.在程序中添加:error_reporting (E_ALL & ~E_NOTICE);

2.或者修改php.ini中的:error_reporting = E_ALL

改为:error_reporting = E_ALL & ~E_NOTICE

3.error_reporting(0);或者修改php.inidisplay_errors=Off

14. instanceof的作用, 经常在什么设计模式中使用

单例模式,但是其他的模式也会用到

15. 1023用二进制表示, 并简述计算过程

10-2

1023%2=1

511%2 =1

255%2 =1

127%2 =1

63%2 =1

31%2 =1

15%2 =1

7%2 =1

3%2 =1

1%2 =1

0 =0

-------------------------------------------

1023

2^9=<N<2^10

511

k=9

10 9 8 7 6 5 4 3 2 1

1 1 1 1 1 1 1 1 1 1

----------------------

1023 1

1023-1/2=511 1

511-1/2=255 1

255-1/2=127 1

127-1/2=63 1

63-1/2=31 1

31-1/2=15 1

15-1/2=7 1

7-1/2=3 1

3-1/2=1 1

-----------------------------------------------

2-10

只需用将二进制数的各个位上的数从最右边开始,最右边的第一个数乘以二的零次方,第二个数乘以二的一次方,第三个数乘以二的二次方,依次类推可得第n个数乘以二的(n-1)次方,然后把得到的结果相加即可

例如:110011=1*2^0+1*2^1+0*2^2+0*2^3+1*2^4+1*2^5=51

这也可以算是一个公式就是An*2^(n-1) An表示二进制数最右边开始的第n个数,

将第一项第二项第三项一直到第n项用式子An*2^(n-1) 计算出来并加在一起即可

16. 下面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"就被切割

17. include和require 分别返回什么错误级别

include会系统警告并继续执行,require会发出系统警告但是会引致致命错误令脚本终止运行

18. 现有一个函数, 有不确定多少个的参数(可能有5个也可能有50个), 如何去定义这个函数

方法一: 不借助php内置函数

方法二: 提示func_num_args() func_get_arg() unc_get_args()

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);

/**

2 * 例子写完后,本来认为完事了,结果遇到有人问call_user_func_array(),看了一下手册

3 * 原来,我上面的那个test函数还可以精简成如下的例子,

4 */

5 function otest1 ($a)

6 {

7 echo( '一个参数' );

8 }

9

10 function otest2 ( $a,$b)

11 {

12 echo( '二个参数' );

13 }

14

15 function otest3 ( $a,$b,$c)

16 {

17 echo( '三个啦' );

18 }

19

20 function otest ()

21 {

22 $args=func_get_args();

23 $num=func_num_args();

24 call_user_func_array( 'otest'.$num,$args );

25 }

26

27 otest(1,2);

19. 在一个函数(该函数没有return语句)里面去处理全局变量, 并且改变他的值, 用两种方法去实现(global和引用&)

$var=1;

function get_pra()

{

global $var;

$var = 'xxx';

echo $var;

}

echo $var.'--';

get_pra();

echo $var;

----------------------------------

$test = 1;

$test1 = 2;

function get_yinyong()

{

global $test1;

$GLOBALS["test"] = &$test1;

}

echo $test."\n";

get_yinyong();

echo $test;

----------------------------

20. 应用中我们经常会遇到在user表随机调取10条数据来展示的情况, 简述你如何实现该功能, 不能使用sql函数以及order by等语句

表 user 字段uid, username

估计一个user表中的区间,在此区间用php去一个随机数,sql语句大于或者小于此id去limit几十条(保证10条数据),再不够散乱的话,取出来的数据shuffle函数打乱数组,array_rand随即取出10个

21. 假设下面的sql语句里面的uid都能获取到具体值, 经过下面语句查询后uid的顺序是什么, 如何去按照uid in 输入的顺序去排序

select uid from user where uid in(10, 1, 3, 8, 11, 4, 7);

可观的结果是1,3,4,7,8,10,11升序,有种情况特殊就是不确定因为中间的某些id人为直接修改可能不是升序了,如果按照uid in的顺序需要重新循环一次根据id获取查询结果数组中的值放进新数组中即可

22. 用PHP将一个字符串中的字母替换成**

preg_replace('/[a-zA-Z]*/','**',$str);
如果指定的字符就可以str_replace('ooxx','**',$str);

代码篇

第一题

 代码如下:

$arr = array(0=>1,"aa"=>2, 3, 4);

 

foreach($arr as $key=>$val){

    print($key == "aa" ? 5 : $val);

}

输出结果是多少?如果的答案是1534就掉入陷阱了。
先看看这个数组最终形成的结构:

代码如下:

Array

(

    [0] => 1

    [aa] => 2

    [1] => 3

    [2] => 4

)

然后遍历每一个元素的key看等不等于aa,等于就用5替代。当我告诉你答案是5534的时候,你会不会有点惊讶!难道0等于"aa"吗?是的,0就等于"aa",这道题重点就考你这个。在PHP中两个值进行逻辑判断时,如果两个值的类型不一致PHP会自动把右边的值转换到左边的类型,然后再进行判断。因此"aa"转换整形等于0,自然也就等于左边的0了。你可以使用全等于避免这种该情况,也就是如果你写成:

代码如下:

print($key === "aa" ? 5 : $val);

那么答案就是1534了。

第二题

代码如下:

$i='11';

printf("%d\n",printf("%d",printf("%d",$i)));

输出结果是多少?如果你回答是11,或者111111就掉入陷阱了。
先了解printf这个函数,printf不仅是打印函数,它还有返回值。重点就在这

代码如下:

var_dump(printf("%d",$i));

你猜猜上面的结果是啥?先是printf打印变量本身11,然后printf会返回一个变量字符串长度的值,11有两个字符,于是返回2,于是上面语句的执行结果等于:

代码如下:

11int(2)

清楚了这一点以后,再回过来看上面的试题,按照优先级,限制性深度printf函数,打印11,返回2。接着到第二级printf函数,打印2,返回1。最后到第三层,直接打印1,所以执行结果是 1121。

第三题

代码如下:

$a = 3;

$b = 5;

if($a = 5 || $b = 7) {

    $a++;

    $b++;

}

echo $a . " " . $b;

执行结果是多少?如果你回答 6 8 or 4 6 or  6 6,那你就掉入陷阱了。
第一个陷阱,认为答案等于 4 6 。估计你粗心把  $a = 5 ||  $b = 7  看成 $a == 5 ||  $b == 7 ,这是新手常犯的错误。

第二个陷阱,认为答案等于 6 8。 你识破了  $a = 5 ||  $b = 7 这个骗局,但你没有注意到,逻辑或里只要依次执行直到某个表达式结果为true,表达式后边的就不再执行,$a = 5 返回true,后边的$b=7就不执行了。

第三个陷阱,认为答案等于 6 6。 OK,你识破了 逻辑或的规则,于是$a=5执行,$b=7不执行,但是你没有考虑到这里是逻辑表达式,返回给$a的值是要转换为布尔值的。这样看。

所以经过以上三个陷阱,你应该知道答案是多少了,其实 $a等于true以后,echo $a 输出就是1 ,$b值不变,结果就是 1 6 。

第四题

代码如下:

$count = 5;

function get_count() {

    static $count = 0;

    return $count++;

}

++$count;

get_count();

echo get_count();

执行结果是多少?如果你回答 2 ,恭喜,你掉入陷阱了。
其实这道题主要考两点,第一点是static静态类型。这种的值永远都是静态的,第一次调用声明等于0,并且自增等于1。第二次调用,1再自增就等于2。但其实这里还有一道陷阱,那就是++a与a++的区别,前++是先自增,后++是先返回值再自增,所以结果等于 1。

第五题

代码如下:

$a = count ("567")  + count(null) + count(false);

echo $a;

如果你回答 3 or 1,恭喜,掉入陷阱了。

因为count(null)等于0,false也算一个值。所以count(false)等于1。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: