php 面试例子举例

1.php数组指针
    $array = [1, 2, 3];
    echo "<pre>",implode(',', $array),"</pre>";
    foreach ($array as &$value) {
//        var_dump($array);
    }
    echo "<pre>",implode(',', $array),"</pre>";
    foreach ($array as $value) {
//        var_dump($array);
    }
    echo "<pre>",implode(',', $array),"</pre>";

结果是:
1,2,3
1,2,3
1,2,2

最后一个结果为啥是1,2,2 呢 foreach中的代码启用之后的输出是:
1,2,3
array (size=3)
0 => &int 1
1 => int 2
2 => int 3
array (size=3)
0 => int 1
1 => &int 2
2 => int 3
array (size=3)
0 => int 1
1 => int 2
2 => &int 3
1,2,3
array (size=3)
0 => int 1
1 => int 2
2 => &int 1
array (size=3)
0 => int 1
1 => int 2
2 => &int 2
array (size=3)
0 => int 1
1 => int 2
2 => &int 2
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]

考察的知识点:

  • foreach (array_expression as $value)语法结构
    遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 value 并且数组内部的指针向前移一步
  • php array数组的结构
    PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型
2.php isset()函数
 $test=null;
    if(isset($test)){
        echo "true";
    }else{
        echo "false";
    }

输出结果是:

false

php官网上的解释为:

检测变量是否设置,并且不是 NULL。
若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE

3.php empty()函数
bool empty ( mixed $var )

empty() 与 isset() 的一个简单比较

<?php
$var = 0;

// 结果为 true,因为 $var 为空
if (empty($var)) {  
    echo '$var is either 0 or not set at all';
}

// 结果为 false,因为 $var 已设置
if (!isset($var)) { 
    echo '$var is not set at all';
}
?>

如果 var 是非空或非零的值,则 empty() 返回 FALSE。换句话说,“”(中间没有空格的)0、0.0(0后含有一个.也是true,.无论有多少个0返回的都是true) “0”、NULL、FALSE、array()、$var都将被认为是空的,如果 var 为空,则返回 TRUE

empty() 只检测变量,检测任何非变量的东西都将导致解析错误。换句话说,后边的语句将不会起作用: empty(addslashes($name))。

4. (php引用) 下面的结果是否能正常打印,为啥
class Config{
    private $values = [];

    public function getValues() {
        return $this->values;
    }
}
$config = new Config();
$config->getValues()['temp'] = 'temp';
echo $config->getValues()['temp'];

结果:
会提示错误 Undefined index: temp,不正常的打印,原因是:
在PHP中,除非你显示的指定返回引用,否则对于数组PHP是值返回,也就是数组的拷贝。因此上面代码对返回数组赋值,实际是对拷贝数组进行赋值,非原数组赋值

将 getValues() {} 改成 &getValues() 程序就可以输出了.

5. (Content-Type类型)以下代码运行后服务器输出什么
$.ajax({

    url: 'http://my.blog.cn/index.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);
file_get_contents 将整个文件读入一个字符串

6. (字符串递增) 以下代码运行的结果是
for ($c = 'a'; $c <= 'z'; $c++) {
    echo $c;
}

单引号换成双引号结果是一样的,

结果

a ~ z aa~ az ya~yz

解释

php中没有char类型,只有string类型,对于’z’ 进行递增 结果是’aa’ (原因是: 在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 a=Z; a++; 将把 $a 变成’AA’可以运行下上面的程序就能找到规律) 对于字符串比较大小,学过C的应该都知道,‘aa’是小于’z’的。这也就解释了为何会有上面的输出结果

如果比较的是纯数字的字符串时,是按数字进行比较的

for ($c = '1'; $c <= '10'; $c++) {
    echo $c;
}

结果是: 1 2 3 4 5 6 7 8 9 10

注意

字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化

<?php
echo '== Alphabets ==' . PHP_EOL;
$s = 'W';
for ($n=0; $n<10; $n++) {
    echo ++$s . ' ';
}
echo PHP_EOL;

for ($n=10; $n>0; $n--) {
    echo (--$s) . ' ';
}
?> 

结果:
== Alphabets ==
X Y Z AA AB AC AD AE AF AG
AG AG AG AG AG AG AG AG AG AG

7. (字符串转int)下面程序的输出结果, 简要说明为什么, 如何解决这类问题?
<?php 
$tmp = 0 == "a"? 1: 2; 
echo $tmp; 
?> 

结果是: 1 int和string类型强制转换造成的

“字符串非数字”转化为数字之后都是0
“字符串和数字”转化为数字之后是0
“数字和字符串”转化为数字之后是前面的数字
“小数点和数字和字符串”转化为数字之后是0

$aa = (int)'asfa';
$bb = (int)'asdf123';
$cc = (int)'23sdf';
$dd = (int)'.23sdf';
echo "\n $aa \n $bb \n $cc\n $dd \n ";

结果是:
0
0
23
0
上面的代码 字符串用”“或”结果是一样的

php手册解释如下: (语言参考–>运算符–>比较运算符)

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。

<?php
var_dump ( 0  ==  "a" );  // 0 == 0 -> true
var_dump ( "1"  ==  "01" );  // 1 == 1 -> true
var_dump ( "10"  ==  "1e1" );  // 10 == 10 -> true
var_dump ( 100  ==  "1e2" );  // 100 == 100 -> true

switch ( "a" ) {
    case  0 :
        echo  "0" ;
        break;
    case  "a" :  // never reached because "a" is already matched with 0
        echo  "a" ;
        break;
}
?>

结果:
bool(true)
bool(true)
bool(true)
bool(true)
0
注: php手册2015最新版下载地址 http://download.csdn.net/detail/u010187139/8950643

8. (求解字符串(中文和英文)长度和查找指定的值

问题: 如何求解字符串”中国2北333京欢迎你”的字符数(一个中文是一个字符),并找到第四个字符”北”

使用php内置函数, 确保配置中已经打开mbstring扩展

$str3 = '中国2北333京欢迎你';
echo mb_strlen($str3, 'utf-8'), "\n";
echo mb_substr($str3, 3, 1, 'utf-8'), "\n";

结果是:
11

注: mb_strlen()和mb_substr()最后的一个参数是可以省略的,如果省略和strlen(),substr()功能一样.
可以参考: http://blog.csdn.net/u010187139/article/details/46872485#t62

9. 运算符的优先级 ( || , =, or)

这三个运算符的优先级是: (逻辑运算符[ && || ]) > (赋值运算符 [ = += -= …] ) > (逻辑运算符[ and xor or ])

// 表达式 (false || true) 的结果被赋给 $e
// 等同于:($e = (false || true))
$e  =  false  ||  true ;

// 常量 false 被赋给 $ftrue 被忽略
// 等同于:(($f = false) or true)
$f  =  false  or  true ;
var_dump ( $e ,  $f );

结果是:
bool(true)
bool(false)

10. floor类型的的变量比较大小

浮点数的精度有限
以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示

例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…。

比较可以用bccomp()函数

var_dump(0.8 >(0.1+0.7));//true
<?php
    $a = 1.23456789;
    $b = 1.23456780;
    $precision = 5;

    if(bccomp($a, $b, $precision)  === 0 ) {
        echo "true";
    } // true
?> 
<?php
    $a = sprintf('%.17f', 0.1+0.2);
    $b = 0.3;

    if(bccomp($a, $b, 17)  !== 0 ) {
        echo "FALSE";
    } // FALSE
?> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值