一个菜鸟驿站!

10 个值得深思的 PHP 面试问题

PHP 2018-04-22 浏览(2001) 评论(0)
- N +

文章目录 [+]

不多说,直接上问题。

Question1:

这个问题关于PHP弱类型

$str1 = 'catlane';
$str2 = 'cat';
if (strpos($str1,$str2)) {
    echo "\"" . $str1 . "\" contains \"" . $str2 . "\"";
} else {
    echo "\"" . $str1 . "\" does not contain \"" . $str2 . "\"";
}

正确输出结果为:

结果:"catlane" does not contain "cat"

strpos是返回str2str1中的位置,没有则返回False,然后这次实际返回的是0,而且在if中0也是false,所以我们要在if中对类型做判断,正确代码如下:

$str1 = 'catlane';
$str2 = 'cat';
if (strpos($str1,$str2) !== false) {
    echo "\"" . $str1 . "\" contains \"" . $str2 . "\"";
} else {
    echo "\"" . $str1 . "\" does not contain \"" . $str2 . "\"";
}

需要注意我们用的是!==,要求对数据类型做判断。

Question2:

这下边的输出结果会怎样?

$x = 5;
echo "<hr>";
echo $x;            
echo "<hr>";
echo $x+++$x++;     
echo "<hr>";
echo $x;            
echo "<hr>";
echo $x-- - $x--;   
echo "<hr>";        
echo $x;

实际运行结果是这样,不知道你们算对没有:

5        //    5
11       //    5 + 6 = 11
7        //    7
1        //    7 - 6 = 1
5        //    5

关于$++$--的问题经常遇到,我们只需要记住$x++和$x--是先计算在赋值,++$x是先赋值再计算就行。

关于运算符的优先级,当然是++大于+-×÷咯,关于运算,有的时候,我们真应该给一个括号来让我们的程序更让人直观的了解,毕竟代码不光是用来运行的,也是或许可以成为提高团队效率的一个


Question3:

关于变量引用

$a = '1';
$b = &$a;
$b = "2$b";
echo 'a:' . $a . '------' . "b:" . $b;

请问:$a和$b分别是多少?


部分人第一时间会想到$a=1,$b=21,但是你要仔细看$b是变量$a的引用,而不是赋值,$a和$b指向同一个值,给上一个很直观的图就可以理解了。


10 个值得深思的 PHP 面试问题  第1张

Question4:

下边是True还是False:

var_dump(0123 == 123);  
var_dump('0123' == 123);  
var_dump('0123' === 123);
var_dump('0123' == '123');   
var_dump('0123' === '123');

var_dump(0123 == 123),PHP默认会把0123当做8进制来处理,实际转化成10进制就是83,显然这是不相等的。


var_dump('0123' == 123),PHP默认会把'0123'转成一个数字,并且去掉前边的0,也就是123 = 123。


var_dump('0123' === 123),很显然说了,这个对比类型的,类型不一样,方然是False。


var_dump('0123' == '123'),同上边的,会把'0123'转成一个数字,删除前边的0,也就是123=123。


var_dump('0123' === '123'),这很显然了,两个字符串不一样,所以是False。

Question5:

下边的代码有什么问题吗?输出会是什么?怎么样修复它?

$referenceTable = array();
$referenceTable['val1'] = array(1, 2);
$referenceTable['val2'] = 3;
$referenceTable['val3'] = array(4, 5);

$testArray = array();

$testArray = array_merge($testArray, $referenceTable['val1']);
var_dump($testArray);  
$testArray = array_merge($testArray, $referenceTable['val2']);
var_dump($testArray);  
$testArray = array_merge($testArray, $referenceTable['val3']);
var_dump($testArray);

实际输出结果如下:

Warning: array_merge(): Argument #2 is not an array in /.../1.php on line 31
NULL 
Warning: array_merge(): Argument #1 is not an array in /...../1.php on line 34
NULL
array(2) {
  [0]=>
  int(1)
  [1]=>
  int(2)
}

可以看到输出第一次输出了,然后就是保存,输出NULL,这是为什么呢?因为array_merge()需要的参数都是数组,如果不是,则返回NULL,并且报错~~,那么你可以这么修改

$testArray = array_merge($testArray, ( array )$referenceTable['val2']);
$testArray = array_merge($testArray, ( array )$referenceTable['val3']);

忽然这是朋友问我(array)是干嘛的?让他变成数组???我说大哥,这是转型,将他转成数组格式的,还可以强转intfloatstring等类型,就好像JAVA的定义类型一样。。然后你们如果有不懂的,可以自行百度一下,谢谢。

Question6:

$x应该输出什么??

$x = true and false;
var_dump($x);
var_dump(true and false);

这个结果就很搞笑了,看结果

true
false

是不是很好玩??咦,第一个居然是true,我这么多年的判断白做了吗??郁闷,其实这里强调的是一个运算符的优先级,=优先级大于andor,所以 $x = true and false其实就是 $x = true;这结果不是为真么,显而易见咯!

Question7:

经过下边的运算$x应该输出什么??

$x = 3 + "15%" + "$25";
echo $x;

emmmm~~,丢人,这个题我一看居然迷茫了,因为我将这个+和js的+弄混了,丢人,我一个PHP程序员,唉,其实他就是很简单的运算,3+15而已,因为PHP会将字符串中数字后边的非数字清空,例如'15&123'就是15,会将如果前边是非数字的变成0,也就是'$25'=0,这就尴尬了,结果是18,算对了吗?小哥哥小姐姐们??

Question8:

运行下边的代码,$text的值是多少?strlen($text)又会返回什么结果?

$text = 'John ';
$text[10] = 'Doe';

结果如下,大跌眼睛:

string(11) "John      D"
int(11)

上边的代码执行完毕后,$text = 'John     D'(John后边有6个空格),strlen($text)会返回Int(11),实际上,$text[10] = 'Doe'给某个字符串的某个具体位置时,实际只会将D赋值给这个位置,虽然$text开始只有5个长度,但是PHP会默认添加空格到中间,这个和其他语言有些差别。

Question9:

下边的输出结果会是什么???

$v = 1;
$m = 2;
$l = 3;

if( ($l > $m) > $v){  
    echo "yes";
}else{
    echo "no";
}

结果如下

no

其实仔细一看就不难分析出($l > $m)就是真的,也就是返回truetrue > $v吗?当然不了,类型不一样,所以输出no。

Question10:

执行下边的代码$x会变成什么值呢?

$x = NULL;
if (0xFF == 255) {
    $x = (int)'0xFF';
}
var_dump($x);
var_dump((int)0xFF);

运行结果如下:

int(0)
int(255)


实际的运行结果是$x变成0,而不是变成255,哎,同样一个有引号,一个没有引号,他会变成不同的,没有引号是因为他是16进制的,所以强转成10的,但是有引号的,他只是字符串,对于int强转,PHP使用is_numeric_string判断是否包含16进制数字然后进行转换,但是对于字符串强转,用的是convert_to_long,它实际上是将字符串从左向右的进行转换,遇到非字符串停下,这个上边提过了,因此,遇到x他就停止了,所以$x = 0;


OK,就到这里了,吃饭去了,明天得面试去,祝我自己好运(*^__^*) 嘻嘻……




标签:
作者:猫巷

,

评论列表 (0)条评论

发表评论

召唤伊斯特瓦尔