文章目录 [+]
不多说,直接上问题。
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是返回str2在str1中的位置,没有则返回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指向同一个值,给上一个很直观的图就可以理解了。
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)是干嘛的?让他变成数组???我说大哥,这是转型,将他转成数组格式的,还可以强转int、float、string等类型,就好像JAVA的定义类型一样。。然后你们如果有不懂的,可以自行百度一下,谢谢。
Question6:
$x应该输出什么??
$x = true and false; var_dump($x); var_dump(true and false);
这个结果就很搞笑了,看结果
true false
是不是很好玩??咦,第一个居然是true,我这么多年的判断白做了吗??郁闷,其实这里强调的是一个运算符的优先级,=的优先级大于and和or,所以 $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)就是真的,也就是返回true,true > $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,就到这里了,吃饭去了,明天得面试去,祝我自己好运,(*^__^*) 嘻嘻……
发表评论