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

1.指针悬挂问题

$array = [1, 2, 3];

echo implode(',', $array), " ";

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

echo implode(',', $array), " ";

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

echo implode(',', $array), " ";

正确答案应该是:

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-dataHttp请求。之所以这样是由于历史原因。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 . " ";

}

正确答案: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官方的一句话:析构函数会在到某个对象的全部引用都被删除或者当对象被显式销毁时运行。这里意思就是当函数栈结束之后才会回收对象才会调用析构函数。


原文地址:https://www.cnblogs.com/mfmdaoyou/p/6748399.html