【关于弱类型】
<?php
$str1 = 'hello i am PHP!';
$str2 = 'hello';
if (strpos($str1,$str2)) {
echo $str1." contains ".$str2;
} else {
echo $str1." does not contains ".$str2;
}
?>
正确运行的输出结果:
hello i am PHP! does not contains hello
strpos是返回字符串str2在str1的位置,没有找到则返回false,然而实际上这次返回了0,而在if语句中0也被当作false,所以我们需要对false做类型判断,正确的代码如下:
<?php
$str1 = 'hello i am PHP!';
$str2 = 'hello';
if (strpos($str1,$str2) !== false) {
echo $str1." contains ".$str2;
} else {
echo $str1." does not contains ".$str2;
}
?>
需要注意的是我们使用了!==,在php 和 JS中!=相对!== 更为严格,后者需要要求数据类型一致。
【关于运算优先级】
<?php
$x = 5;
echo $x;
echo "<br />";
echo $x+++$x++;
echo "<br />";
echo $x;
echo "<br />";
echo $x---$x--;
echo "<br />";
echo $x;
?>
输出结果:
5
11
7
1
5
关于 $x++ 和 $x–这个问题其实非常容易遇见,我们只需记住$x++使用最近的值,然后才自增。运算符的优先级,++ 是明显高于 +,因此先执行++ 再执行 + 。关于运算符的优先级,有的时候我们真的可以通过括号来让我们的程序更让人直观的了解,毕竟代码不光是用于执行的,有的时候或许团队的可读性也是提高效率的一种。
<?php
$x = true and false;
var_dump($x);
?>
输出结果:bool(true)
因为 = 会比 and级别高点,因此等同下面的代码
$x = true;true and false
【关于变量引用】
<?php
$a = '1';
$b = &$a;
$b = "2$b";
echo '$a='.$a.';$b='.$b;
?>
运行结果:
$a=21;$b=21
因为$b是$a的引用,也就是两个指向同一个内存地址,所以改变$b的值等于在改变$a的值。
【关于数字与数字字符串的比较】
先看看下面这段代码:
<?php
var_dump(0123 == 123);
var_dump('0123' == 123);
var_dump('0123' === 123);
?>
输出结果:bool(false) bool(true) bool(false)
1.PHP会默认把0123当作8进制来处理,实际转化为10进制就是83,显然这不是相等的。
2.PHP将’0123′转换成一个数字而且默认去掉了前面的0也就是123==123,这里若用===则返回false,因为数据类型不一致。
【关于字符串的自动类型转换】
看看下面的代码输出结果是什么:
<?php
$x = 3 + "15%" + "$25";
var_dump($x);
?>
输出结果:int(18)
PHP是会根据上下文实现类型的自动转换,上面的代码我们可以这样理解,如果我们在与字符串进行数学运算,实际PHP会尽可能将字符串中的数字进行转换,如果是数字开头的话则转换成改数字比如”15%”会变成15,如果不是数字开头则会变成0; 上面的运算类似下面 :
$x = 3 + 15 + 0
看看下面的代码输出结果是什么:
<?php
$x = NULL;
if ('0xFF' == 255) {
$x = (int)'0xFF';
}
var_dump($x);
?>
输出结果:int(0)
首先’oxFF’ == 255我们好判断,会进行转换将16进制数字转换成10进制数字,0xff 等于 255.PHP使用is_numeric_string 判断字符串是否包含十六进制数字然后进行转换。但是$x = (int)’0xFF’;是否也会变成255呢?显然不是,将一个字符串进行强制类型转换实际上用的是convert_to_long,它实际上是将字符串从左向右进行转换,遇到非数字字符则停止。因此0xFF到x就停止了。所以$x=0
转载请注明出处:php1234.cn ,原文地址:http://www.php1234.cn/a/xiulianzhilu/2016/0927/80.html