官方文档拾遗(基础篇)

说明

最近又看了一遍PHP官方文档。说句实话,PHP官方文档的组织还算不错的,条理清晰,链接合理;尤其页面下方的开发者自己撰写的评论,更是文档的精华。所以我觉得多看几遍文档并且勤于动手实践,就可以超过大多数人了。现将我的收获总结如下,欢迎品尝。

类型转换问题

var_dump(0 == 'all'); // bool(true)

在此处要小心, all和0比较时, 字符串all被转化为数值类型0了。

在switch语句中,尤其要注意此问题:

1
2
3
4
5
6
7
8
switch ("a") {
case 0:
echo "0"; // 输出0
break;
case "a":
echo "a"; // 不会执行到这里,和上例一样,a已经转化为数值类型0.
break;
}

数字连接问题

用字符串连接符(.)连接2个整型数字时,可在连接符前后加空格以不至于变成小数

1
2
3
echo 1 . 2; //prints the string "12"
echo 1.2; //prints the number 1.2
echo 1+2; //prints the number 3

函数名及变量名大小写问题

PHP函数调用是不区别大小写的,而变量名区别大小写。

1
2
3
4
5
6
7
function aA(){
echo 'lamp';
}
AA(); //lamp

$a = 'hello';
echo $A; //Notice: Undefined variable: A

echo 的返回值问题

echo 不是一个函数,所以没有返回值;因而不能用在需要有返回值的表达式中

1
2
$value = 'lamp';
isset($value) AND echo $value; // PHP Parse error: syntax error, unexpected 'echo' (T_ECHO)

如果真得想在这样的表达式中输出变量值,可以用print函数代替, 因为print函数问题返回1

1
isset($value) AND print($value); // lamp

从函数里返回引用问题

从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符 &; 如果只在一处加上&,则并不会返回引用

1
2
3
4
5
function &returns_reference()
{
return $someref;
}
$newref = & returns_reference();

数组中的+运算符

+ 运算符把右边的数组元素附加到左边的数组后面. 两个数组中都有的键名,则只用左边数组中的,右边的被忽略。同理,对于索引数组也是如此,同一索引处的值会使用前面数组的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
print_r($a + $b);

Output:
Array
(
[a] => apple
[b] => banana
[c] => cherry
)

$a = array('one','two');
$b = array('three','four','five');
print_r ($a + $b);

Output:
Array
(
[0] => one
[1] => two
[2] => five
)

递增/递减(++/–)运算符

递增/递减运算符不但能递增/递减整型数字,还能递增/递减字符等

1
2
3
4
5
6
7
8
9
10
11
12
$s = 'W';
for ($n=0; $n<6; $n++) {
echo ++$s . PHP_EOL;
}

// 输出为:
X
Y
Z
AA
AB
AC

是不是发现可以很方便的生成出excel的横向坐标轴?

运算符的结合性

如果运算符优先级相同,那运算符的结合方向决定了该如何运算。例如,”-“是左联(从左往右看)的,那么 1 - 2 - 3 就等同于 (1 - 2) - 3 并且结果是 -4. 另外一方面,”=”是右联(从右往左看)的,所以 $a = $b = $c 等同于 $a = ($b = $c)。
观察可知只有单目运算符和(组合)赋值运算符为右联的。

未定义常量使用问题

未定义某常量就直接使用该常量时会被评估为true.所以将常量放在if判断里最好要明确判断其值

1
2
3
4
5
6
7
8
// DEBUG并没有在上下文中被定义为常量
if (DEBUG) {
echo 'lamp'; //DEBUG未定义,会报Notice: Use of undefined constant DEBUG. 但是依然能输出lamp.
}

if (DEBUG == true) {
echo 'lamp';//对常量值做判断就不会在没有定义时执行if内部的语句。仅仅是报notice.
}

更简洁的类型转换技巧

1
2
3
4
5
6
7
8
$string  = '12345.678';
$float = +$string;
$integer = 0|$string;
$boolean = !!$string;

var_dump($float); //float(12345.678)
var_dump($integer); //int(12345)
var_dump($boolean); //bool(true)

字符串中的字符访问

字符串也可以像数组那样使用中括号的索引下标方式访问,也可是用大括号的索引下标方式访问

1
2
3
4
5
$a    = 'car'; // $a is a string
$a[0] = 'b'; // $a is still a string
$a{1} = 'o';
echo $a; // bor
$a['data'] = 'a'; //报错 Warning: Illegal string offset 'data'

数组的键类型及转换

数组的key 可以是 integer 或者 string。value 可以是任意类型。

此外 key 会有如下的强制转换:

  • 包含有合法整型值的字符串会被转换为整型。例如键名 “8” 实际会被储存为 8。但是 “08” 则不会强制转换,因为其不是一个合法的十进制数值。
  • 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
  • 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
  • 数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
  • 如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
1
2
3
4
5
6
7
$array = array(
1 => "a",
"1" => "b",
1.5 => "c",
true => "d",
);
var_dump($array); // array(1 => "d")

数组的下标访问

方括号和花括号都可以用来访问数组单元(例如 $array[42] 和 $array{42} 效果相同)。

1
2
3
4
5
6
$array = array(
"foo" => "bar",
42 => 24,
);
var_dump($array[42]); // int(24)
var_dump($array{42}); // int(24)

浮点数计算的注意事项

php中的浮点数也是遵循IEEE754规范定义(应该是C遵循)的那种存储方式,所以对于浮点数计算有精度问题, 解决方案就像下例提到的
使用BC Math 扩展或GMP扩展

1
2
echo intval(19.31 * 100); //1930
echo bcmul(19.31, 100); //1931

unset函数都干了什么

由下例可知,unset函数斩断变量名到值的联系(引用), 因此当$a被unset掉后,$a变量名与5这个值就失去了联系,但是$b和5这个
值的联系还在,所以$b可以正常输出. 当$a被赋值为NULL后,实际上是把之前存储5这块内存设置为了NULL,所以这回$b也被设置成了NULL

1
2
3
4
5
6
7
8
9
10
11
$a = 5;
$b = & $a;
unset($a);
print "b $b"; // b 5

$a = 5;
$b = & $a;
$a = NULL;
print "b $b"; //b

var_dump($b); //NULL

break关键字和continue关键字后面的数字

break关键字用于结束当前for,foreach,while,do-while 或者switch结构的执行,另外break还可以接受一个可选的数字参数来决定跳出几重循环。这对复杂的循环嵌套非常有用;同理,continue关键字也支持

1
2
3
4
5
6
7
8
9
10
11
12
13
$i = 0;
while (++$i) {
switch ($i) {
case 5:
echo "At 5";
break 1; //只退出 switch
case 10:
echo "At 10";
break 2; //退出 switch 和 while 循环
default:
break;
}
}
  • © 2015-2020 watson

请我喝杯咖啡吧~

支付宝
微信