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.下面代码执行后server输出什么?
$.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);
这就解释了为什么微信公众平台开发时也要用这个方式获取微信serverpost的数据
6.下面代码输出的结果是:
for ($c = 'a'; $c <= 'z'; $c++) {
echo $c . "\n";
}
正确答案:a.......z,aa.....yz
解释:在PHP中不存在char数据类型,仅仅有string类型。明确这点,那么对'z'进行递增操作,结果则为'aa'。
对于字符串比較大小,学过C的应该都知道,'aa'是小于'z'的。
这也就解释了为何会有上面的输出结果。
可是PHP中假设比較的是两个纯数字的字符串时,首先尝试将其当成数字来比較的。
7.下面代码的执行结果是:
class test{
public $id;
function __destruct(){
echo $this->id;
}
}
class Page{
function index(){
$user1 = new test();
$user1->id='tom';
$this->test();
}
function test(){
$user2= new test();
$user2 ->id='333333333';
}
}
$Page=new Page();
$Page->index();
?>
正确答案:333333333tom
解释:为什么不是tom333333333呢?引用php官方的一句话:析构函数会在到某个对象的全部引用都被删除或者当对象被显式销毁时运行。这里意思就是当函数栈结束之后才会回收对象才会调用析构函数。
PHP面试题遇到的几个坑。...面壁ing的更多相关文章
- php踩过的那些坑(3) 数据类型转换
一.前方有坑 php属于弱类型语言,不会强迫工程师在使用变量之前先声明变量类型,开发时爽了,但是也带来不少的坑.下面就举一个坑的例子: 例1: $str = ‘haodaquan'; echo ($s ...
- 紧跟腾讯大王卡:B站2233卡“基友号”即将上线
来自B站官方的消息显示,B站在近期也将推出"基友号"功能,功能的内容是通话免费,考虑到这类互联网套餐都是中国联通在运营,因此在内容上可能也会效仿腾讯大王卡实现免费通话. 目前,B站 ...
- JAVA中使用freemark生成自定义文件(json、excel、yaml、txt)
原文:http://blog.csdn.net/jinzhencs/article/details/51461776 场景:在我们工作中,有时需要生成一些文件,可能它不是一种标准的格式,比如JSON. ...
- 能避开很多坑的mysql面试题,你知道吗?
最近有一些朋友问我一些mysql相关的面试题,有一些比较基础,有些比较偏.这里就总结一些常见的mysql面试题吧,都是自己平时工作的总结以及经验.大家看完,能避开很多坑.而且很多问题,都是面试中也经常 ...
- 蛮考验基础的JS笔试题(有坑小心!)
1. 考察this var length = 10 function fn(){ alert(this.length) } var obj = { length: 5, method: functi ...
- JavaScript 面试题,给大家补补基础,加加油,埋埋坑!
以下是我根据个人爱好收集网罗的一些个觉得还可以的面试题,觉得很有意思,给小伙伴们分享一下! ======后续还会继续追加试题.................... 第一道题: 下面弹出a的结果是多少 ...
- 带坑的几道PHP面试题
第二题 代码如下: $i='11'; printf("%d\n",printf("%d",printf("%d",$i))); 输出结果是多 ...
- 一道关于String的面试题,新鲜出炉,刚被坑过,趁热!!
很多人都会答错的一道关于String的题目,究竟有什么难度? 我们一起来看一道关于String的面试题,准确说是改编的面试题! 准备好啦?在放大招之前先来一个小招式 String s1 = new S ...
- oc深坑測试题及其答案
一.选择题(共80题,每题1分) 1. 不会立马使引用计数器改变的是: 答案:(C) A.release B.alloc C.autorelease D.retain 2. 在OC中类的接口声 ...
随机推荐
- css实现0.5像素
.border{ position: relative; } .border:before{ content: ''; position: absolute; width: 200%; height: ...
- canvas2D 基础知识 浅析
1.canvas HTML5给出的一个可以展示绘图内容的标签 使用领域: (推荐网站:threejs.org) 1. 游戏 2. 可视化数据 3. Banner广告 4. 多媒体 (1)在 c ...
- js函数调用与声明 (for时注意)
可以的: test(); // 直接function 方式声明的函数可以直接调用,后声明 function test(){} aa(); //error var 方式声明的函数需先声明后调用v ...
- MFC数据类型转换 _itoa atoi、atof、itoa、itow _itoa_s
_itoa 功能:把一整数转换为字符串 用法:char * _itoa(int value, char *string, int radix); 详细解释: _itoa是英文integer to ar ...
- UVA 10205 Stack 'em Up
直接模拟就好. #include <map> #include <set> #include <list> #include <cmath> #incl ...
- UVA 10079 Pizze Cutting
题意:N条直线最多把平面分成几个部分 ans=1+(N+1)*N/2; 直线数量 1 2 3 4 …………n把平面分成的块数 2 4 7 11 1+1 1+1+2 1+1+2+3 1+1+2+3+4 ...
- usb驱动---What is the difference between /dev/ttyUSB and /dev/ttyACM【转】
转自:http://blog.csdn.net/ppp2006/article/details/25654733 https://www.rfc1149.net/blog/2013/03/05/wha ...
- 12.OpenStack镜像和存储服务配置
配置镜像服务 编辑 /etc/glance/glance-api.conf与/etc/glance/glance-registry.conf添加以下内容 [DEFAULT] notification_ ...
- 在C#中将金额转换成中文大写金额
具体代码如下: /// <summary> /// 金额转换成中文大写金额 /// </summary> /// <param name="LowerMoney ...
- chrome报错a parser-blocking, cross-origin script, is invoked via document.write.
确切的说是警告,内容是: A Parser-blocking, cross-origin script, http://s4.cnzz.com/stat.php?id=xxx&show=pic ...