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的更多相关文章

  1. php踩过的那些坑(3) 数据类型转换

    一.前方有坑 php属于弱类型语言,不会强迫工程师在使用变量之前先声明变量类型,开发时爽了,但是也带来不少的坑.下面就举一个坑的例子: 例1: $str = ‘haodaquan'; echo ($s ...

  2. 紧跟腾讯大王卡:B站2233卡“基友号”即将上线

    来自B站官方的消息显示,B站在近期也将推出"基友号"功能,功能的内容是通话免费,考虑到这类互联网套餐都是中国联通在运营,因此在内容上可能也会效仿腾讯大王卡实现免费通话. 目前,B站 ...

  3. JAVA中使用freemark生成自定义文件(json、excel、yaml、txt)

    原文:http://blog.csdn.net/jinzhencs/article/details/51461776 场景:在我们工作中,有时需要生成一些文件,可能它不是一种标准的格式,比如JSON. ...

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

    最近有一些朋友问我一些mysql相关的面试题,有一些比较基础,有些比较偏.这里就总结一些常见的mysql面试题吧,都是自己平时工作的总结以及经验.大家看完,能避开很多坑.而且很多问题,都是面试中也经常 ...

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

    1.  考察this var length = 10 function fn(){ alert(this.length) } var obj = { length: 5, method: functi ...

  6. JavaScript 面试题,给大家补补基础,加加油,埋埋坑!

    以下是我根据个人爱好收集网罗的一些个觉得还可以的面试题,觉得很有意思,给小伙伴们分享一下! ======后续还会继续追加试题.................... 第一道题: 下面弹出a的结果是多少 ...

  7. 带坑的几道PHP面试题

    第二题 代码如下: $i='11'; printf("%d\n",printf("%d",printf("%d",$i))); 输出结果是多 ...

  8. 一道关于String的面试题,新鲜出炉,刚被坑过,趁热!!

    很多人都会答错的一道关于String的题目,究竟有什么难度? 我们一起来看一道关于String的面试题,准确说是改编的面试题! 准备好啦?在放大招之前先来一个小招式 String s1 = new S ...

  9. oc深坑測试题及其答案

    一.选择题(共80题,每题1分) 1. 不会立马使引用计数器改变的是: 答案:(C)  A.release  B.alloc  C.autorelease  D.retain 2. 在OC中类的接口声 ...

随机推荐

  1. [经验分享]WeTouch中使用VueInputCode

    如果你想在WeTouch中使用以下输入框的效果,需要做以下几个步骤: 第一步:安装Node.js 第二步:使用Npm在全局安装vue-input-code ,使用命令提示符,在Node安装根目录输入以 ...

  2. Springboot+Redis序列化坑

    今天在测试springboot整合redis的时候遇到下面这个坑,百度来百度去发现提示都是ajax的问题,真的是醉了,错误提示如下所示,不信大家可以直接复制百度一下答案是什么(流泪中....),错误如 ...

  3. react dva routerRedux 备忘

    首先你需要import { Link, routerRedux } from 'dva/router'; 在方法里跳转用 function applyJobHandler(){ dispatch(ro ...

  4. Oracle 整理

    高效分页 select * from ( select rownum r,a from yourtable order by name ) --之所以没有把<=20放在最外面,也就是我一直用的写 ...

  5. windows7下检测耳机麦克拔插(转)

    原文转自 https://blog.csdn.net/rankun1/article/details/50972990 #include "stdafx.h" #define SA ...

  6. android hook 框架 xposed 如何实现注入

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

  7. python grequests和requests比较

    #!/usr/bin/env python # encoding: utf-8 import grequests import requests import timeit import time d ...

  8. dnspod 批量添加记录

    #!/usr/bin/python #-*- coding: utf-8 -*- import os,requests,json import re,xlsxwriter,time import xl ...

  9. hdu 5084(矩阵操作)

    HeHe Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submis ...

  10. hdu 1116(并查集+欧拉路径)

    Play on Words Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...