php容易被忽略的知识点

1.要输出大段文本时,跳出 PHP 解析模式通常比将文本通过 echoprint输出更有效率。就是说混编模式中 echo 结构比直接写html结构效率低


2.文件末尾的 PHP 代码段结束标记(分号)可以不要,有些情况下当使用 include或者 require时省略掉会更好些,这样不期望的空白符就不会出现在文件末尾,之后仍然可以输出响应标头。在使用输出缓冲时也很便利,就不会看到由包含文件生成的不期望的空白符。


3.以十进制能够精确表示的有理数如 0.10.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10)通常会返回7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...


4.任何具有 string表达的标量变量,数组单元或对象属性都可使用此语法。只需简单地像在 string以外的地方那样写出表达式,然后用花括号 {} 把它括起来即可。由于 { 无法被转义,只有$紧挨着 { 时才会被识别。可以用 {\$ 来表达 {$。例如: "this is a {$model->attr} demo"


5.另外还有 URL 字符串函数,也有加密/解密字符串的函数(mcryptmhash)。自 5.4 起可以使用短数组定义语法,用[] 替代 array()。$arr = array('x'=>1) = ['x'=>1]


6.如果给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。如果当前还没有整数索引,则键名将为 0

注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下面的例子来说明:

<?php
 // 创建一个简单的数组
 $array  = array( 1 ,  2 ,  3 ,  4 ,  5 );
 print_r ( $array );
 
// 现在删除其中的所有元素,但保持数组本身不变:
 foreach ( $array  as  $i  =>  $value ) {
    unset( $array [ $i ]);
}
 print_r ( $array );
 
// 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
 $array [] =  6 ;
 print_r ( $array );
 
// 重新索引:
 $array  =  array_values ( $array );
 $array [] =  7 ;
 print_r ( $array );
 ?> 

以上例程会输出:
 

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
)
Array
(
    [5] => 6
)
Array
(
    [0] => 6
    [1] => 7
)

7.如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为NULL ,则新的实例为空。数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其它的值,名为 scalar 的成员变量将包含该值。

<?php
$obj  = (object)  'ciao' ;
echo  $obj -> scalar ;   // outputs 'ciao'
 ?>

8.在函数原型中,$... 表示等等的意思。当一个函数可以接受任意个参数时使用此变量名。


9.void 作为返回类型意味着函数的返回值是无用的。void作为参数列表意味着函数不接受任何参数。


10由于 PHP 支持使用和数组下标同样的语法访问字符串下标,以下例子在所有 PHP 版本中都有效:

<?php
$a = 'car' ; // $a is a string
$a [ 0 ] = 'b' ; // $a is still a string
echo $a ; // bar
?>


11.PHP 中全局变量在函数中使用时必须声明为 global


12.要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1]时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要$$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用${$a[1]} ,对第二种情况用 ${$a}[1]


13.变量名中的点和空格被转换成下划线。例如 <input name="a.b" /> 变成了 $_REQUEST["a_b"]


14.如果使用了一个未定义的常量,PHP 假定想要的是该常量本身的名字,如同用字符串调用它一样(CONSTANT 对应 "CONSTANT")。此时将发出一个 E_NOTICE级的错误


15.如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被 转换为数值并且比较按照数值来进行。此规则也适用于 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;
}
 ?> 


16.由于浮点数 float 的内部表达方式,不应比较两个浮点数是否相等。

17.在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 $a = 'Z'; $a++; 将把 $a变成 'AA',而在 C 中, a = 'Z'; a++; 将把 a 变成 '[''Z'的 ASCII 值是 90, '[' 的 ASCII 值是 91)。注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化。
<?php
$i  =  'W' ;
for ( $n = 0 ;  $n < 6 ;  $n ++) {
    echo ++ $i  .  "\n" ;
}
 ?> 


以上例程会输出:
 

X
Y
Z
AA
AB
AC


18. break 可以接受一个可选的数字参数来决定跳出几重循环。 continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是 1,即跳到当前循环末尾。 

19. 注意和其它语言不同,continue语句作用到 switch 上的作用类似于 break。如果在循环中有一个 switch 并希望 continue 到外层循环中的下一轮循环,用 continue 2

20.闭包函数也可以作为变量的值来使用。PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号:
<?php
$greet  = function( $name )
{
     printf ( "Hello %s\r\n" ,  $name );
};
 
$greet ( 'World' );
 $greet ( 'PHP' );
 ?> 


22.PHP中的"重载"与其它绝大多数面向对象语言不同。传统的"重载"是用于提供多个同名的类方法,但各方法的参数类型和个数不同。

23.serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。    

与之相反, unserialize() 会检查是否存在一个 __wakeup()方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源。

__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。   


23.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值