PHP面试题遇到的几个坑。...面壁ing

1.指针悬挂问题

$array = [1, 2, 3];

echo implode(‘,‘, $array), "\n";

foreach ($array as &$value) {}    // by reference

echo implode(‘,‘, $array), "\n";

foreach ($array as $value) {}     // by value (i.e., copy)

echo implode(‘,‘, $array), "\n";

正确答案应该是:

1,2,3

1,2,2

解释:

我们来分析下。第一个循环过后,$value是数组中最后一个元素的引用。第二个循环开始:

第一步:复制$arr[0]到$value(注意此时$value是$arr[2]的引用),这时数组变成[1,2,1]

第二步:复制$arr[1]到$value,这时数组变成[1,2,2]

第三步:复制$arr[2]到$value,这时数组变成[1,2,2]

2.以下结果输出:

<?php

$test=null;

if(isset($test)){

echo "true";

}else{

echo "false";

}

?>

正确答案:false

解释:对于 isset() 函数,变量不存在时会返回false,变量值为null时也会返回false。

判断一个变量是否真正被设置(区分未设置和设置值为null),array_key_exists()函数或许更好。

3.以下结果能否打印出来,为什么?

class Config{

private $values = [];

public function getValues() {

return $this->values;

}

}

$config = new Config();

$config->getValues()[‘test‘] = ‘test‘;

echo $config->getValues()[‘test‘];

正确答案:

不行,因为在PHP中,除非你显示的指定返回引用,否则对于数组PHP是值返回,也就是数组的拷贝。因此上面代码对返回数组赋值,实际是对拷贝数组进行赋值,非原数组赋值。如果把代码改成:

class Config{

private $values = [];

// return a REFERENCE to the actual $values array

public function &getValues() {

return $this->values;

}

}

$config = new Config();

$config->getValues()[‘test‘] = ‘test‘;

echo $config->getValues()[‘test‘];

就可以了。

知识要点:PHP中对于对象,默认是引用返回,数组和内置基本类型默认均按值返回。这个要与其它语言区别开来(很多语言对于数组是引用传递)。

4.以下代码运行后服务器输出什么?

$.ajax({

url: ‘http://my.site/ndex.php‘,

method: ‘post‘,

data: JSON.stringify({a: ‘a‘, b: ‘b‘}),

contentType: ‘application/json‘

});

var_dump($_POST);

答案:array(0){}

解释:PHP仅仅解析Content-Type为 application/x-www-form-urlencoded 或 multipart/form-data的Http请求。之所以这样是因为历史原因,PHP最初实现$_POST时,最流行的就是上面两种类型。因此虽说现在有些类型(比如application/json)很流行,但PHP中还是没有去实现自动处理。因为$_POST是全局变量,所以更改$_POST会全局有效。因此对于Content-Type为 application/json 的请求,我们需要手工去解析json数据,然后修改$_POST变量。

$_POST = json_decode(file_get_contents(‘php://input‘), true);

这就解释了为什么微信公众平台开发时也要用这个方式获取微信服务器post的数据

6.以下代码输出的结果是:

for ($c = ‘a‘; $c <= ‘z‘; $c++) {

echo $c . "\n";

}

正确答案:a.......z,aa.....yz

解释:在PHP中不存在char数据类型,只有string类型。明白这点,那么对‘z‘进行递增操作,结果则为‘aa‘。对于字符串比较大小,学过C的应该都知道,‘aa‘是小于‘z‘的。这也就解释了为何会有上面的输出结果。

但是PHP中如果比较的是两个纯数字的字符串时,首先尝试将其当成数字来比较的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 02:38:38

PHP面试题遇到的几个坑。...面壁ing的相关文章

C/C++程序编译步骤以及如何生成可执行文件

一.开篇 许久不碰关于这方面的知识了,前几天同学开课提及到该部分,正好作为回顾吧. C/C++语言很多人都比较熟悉,这基本上是每位大学生必学的一门编程语言,通常还都是作为程序设计入门语言学的,并且课程大多安排在大一(反正我是混过来的).刚上大学,学生们还都很乖,学习也比较认真.用心.所以,C/C++语言掌握地也都不错(说的是你么),不用说编译程序,就是写个上几百行的程序都不在话下,但是他们真的知道C/C++程序编译的步骤么? 很多人都不是很清楚吧,如果接下来学过"编译原理",也许能说个

leetcode152.MaximumProductSubarray最大连乘子序列

08昭g怨潦4k6烁干4嚼http://www.zcool.com.cn/collection/ZMTg0MjIxODA=.html Ux让劝没褂溉耸9奈1VLhttp://www.zcool.com.cn/collection/ZMTg0MjIyMzY=.html pc0F赜殴词39岩F7http://www.zcool.com.cn/collection/ZMTg0MjIyODA=.html 6瘸4P腿嘿9T1Ahttp://www.zcool.com.cn/collection/ZMTg0

能避开很多坑的mysql面试题,你知道吗?

最近有一些朋友问我一些mysql相关的面试题,有一些比较基础,有些比较偏.这里就总结一些常见的mysql面试题吧,都是自己平时工作的总结以及经验.大家看完,能避开很多坑.而且很多问题,都是面试中也经常问到!希望能对大家的面试有一些帮助!!! 比如,下面这些问题: 1.为什么一定要设一个主键? 2.你们主键是用自增还是UUID? 3.自增主机用完了怎么办? 4.主键为什么不推荐有业务含义? 5.货币字段用什么类型?? 6.时间字段用什么类型? 7.为什么不直接存储图片.音频.视频等大容量内容? 8

蛮考验基础的JS笔试题(有坑小心!)

1.  考察this 1 var length = 10 2 function fn(){ 3 alert(this.length) 4 } 5 var obj = { 6 length: 5, 7 method: function(fn) { 8 fn() // ? 9 arguments[0]() // ? 10 } 11 } 12 obj.method(fn) 这里的坑主要是arguments,我们知道取对象属于除了点操作符还可以用中括号,这里fn的scope是arguments,即fn内

C#经典面试题的坑

最近看了些简单的面试题,发现有几个地方不对劲啊. 1.在 下面的例子里 using System; class A { public A() { PrintFields(); } public virtual void PrintFields(){} } class B:A { int x=1; int y; public B() { y=-1; } public override void PrintFields() { Console.WriteLine("x={0},y={1}"

Java程序员面试中最容易答错的8道面试题,你中坑了吗?

1. static 和 final 的用法 static 的作用从三个方面来谈,分别是静态变量.静态方法.静态类. 静态变量:声明为 static 的静态变量实质上就是全局变量,当声明一个对象时,并不产生static 变量的拷贝,而是该类所有实例变量共用同一个 static 变量.也就是说这个静态变量只加载一次,只分配一块储存空间. 静态方法: 声明为static的静态方法有以下几个特点: (1)静态方法只能调用静态方法: (2)静态方法只能访问静态数据: (3)静态方法不能以任何方式引用thi

oc深坑測试题及其答案

一.选择题(共80题,每题1分) 1. 不会立马使引用计数器改变的是: 答案:(C) A.release B.alloc C.autorelease D.retain 2. 在OC中类的接口声明keyword为: 答案:(B) A.@import B.@interface C.@implemention D.@protocol 3. NSString *name = [[NSString alloc]initWithString:@"张三"];NSLog(@"%d"

java比较坑的面试题

1. public class Test { public static void main(String[] args) { User u = new User("fff"); Test.setUsers(u); System.out.println(u.getName()); } public static void setUsers(User u){ u = null; } } public class User { private String name; public Use

一道容易栽坑的有趣的面试题(关于js,定时器,闭包等)

1.首先下面代码输出什么? 1 for (var i = 0; i < 5; i++) { 2 console.log(i); 3 } 输出:0 1 2 3 4 2.上面只是普通的输出,没有陷阱再看下面这个题(套路开始了) 1 for (var i = 0; i < 5; i++) { 2 setTimeout(function() { 3 console.log(i); 4 }, 1000 * i); 5 } 输出:5 5 5 5 5 setTimeout 会延迟执行,那么执行到 conso