php面试题遇到的坑,PHP面试题碰到的几个坑。面壁ing

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.以下结果输出:

$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中如果比较的是两个纯数字的字符串时,首先尝试将其当成数字来比较的。

网友评论

文明上网理性发言,请遵守 新闻评论服务协议我要评论

47d507a036d4dd65488c445c0974b649.png

立即提交

专题推荐064df72cb40df78e80e61b7041ee044f.png独孤九贱-php全栈开发教程

全栈 100W+

主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

7dafe36c040e31d783922649aefe0be1.png玉女心经-web前端开发教程

入门 50W+

主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

04246fdfe8958426b043c89ded0857f1.png天龙八部-实战开发教程

实战 80W+

主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值