PHP基础知识总结

count 计数

  1. count( $array, [ $mode = COUNT_NORMAL ] )
    COUNT_NORMAL = 0,普通模式
    COUNT_RECURSIVE = 1,递归模式,统计多维数组所有单元

  2. 特殊值的计数

    1
    2
    3
    4
    count(null);
    // 0
    count(false);
    // 1

数组定义相同键名问题

1、 键名相同,后者会覆盖前者
2、 数字键名,有无引号的代表相同键名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$a = array(
1 => 'a',
'1' => 'b',
4 => 'c',
'04' => 'e'
);
print_r($a);
# 输出结果:
#
# Array
# (
# [1] => b
# [4] => c
# [04] => e
# )

数组间操作 + 与 array_merge 的区别

  1. “+” 数组相加,键名相同取优先出现的值,元素总数可能会减少
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $a = array(
    1 => 'a',
    '1' => 'b',
    4 => 'c'
    );
    $b = array(
    2 => 'd',
    4 => 'e'
    );
    print_r( $a + $b );
    # 输出结果
    #
    # Array
    # (
    # [1] => b
    # [4] => c
    # [2] => d
    # )
  1. array_merge 数组合并,非数字键名后面的覆盖前面的,数字键名的元素个数不变,按出现顺序重新编号
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    $a = array(
    1 => 'a',
    '1' => 'b',
    4 => 'c',
    '04' => 'd'
    );
    $b = array(
    2 => 'e',
    '04' => 'f',
    4 => 'g',
    '40' => 'h'
    );
    print_r( array_merge( $a, $b ) );
    # 输出结果
    #
    # Array
    # (
    # [0] => b
    # [1] => c
    # [04] => f
    # [2] => e
    # [3] => g
    # [4] => h
    # )

浮点数的比较

  1. PHP 通常使用 IEEE 754 双精度格式,同 js
  2. 有些浮点数无法用二进制位准确表示,会产生误差,当进行复合运算时,误差可能会积累

    IEEE 754 浮点数运算

    IEEE 754 浮点数的表示可参考 揭秘 0.1 + 0.2 != 0.3

  3. 需要更高的精度,应该使用 任意精度数学函数 或者 gmp 函数

边界值 intval()(int)

  • 32位系统下,边界值是-2147483648到2147483647
  • 64位系统下,边界值是-9223372036854775808到9223372036854775807
  • 对于超过边界值的数值进行上述函数操作,会得到错误的结果
  • mysql 中,字段中也要注意边界值问题

实例化一个空类 StdClass

1
$emptyClass = new StdClass();

stdClass 类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没有可以调用的方法

算数运算注意

  1. 求余 % 结果的符号
    结果的符号和被求除数的符号相同,被除数和除数不是整数的,先被自动取整。

    1
    2
    3
    4
    -5 % 3;
    // -2
    -5.9 % 3.2;
    // -2
  2. 除法 / 结果是否是浮点数问题
    除法的结果是浮点数,除非能够整除

    1
    2
    3
    4
    1/2;
    // 0.5
    0.5 / 0.25;
    // 0.2
  3. 幂运算 **
    **的优先级在所有的运算符中最高

    1
    2
    3
    4
    5
    6
    3**2;
    // 9
    2**1/2;
    // 1
    2**(1/2);
    // 1.4142135623731
  4. 自然对数 e 为底的指数运算 exp

    1
    2
    echo exp(1);
    // 2.718281828459045
  5. 位操作运算符
    & 按位与
    | 按位或
    ^ 按位异或
    ~ 按位取反
    << 按位左移
    >> 按位右移

  6. 运算优先级
    运算优先级

好用的PHP函数

  1. array_map( <函数名>, <数组> )
    将函数作用在数组的每一个值上面,返回带有新值的数组
    有多个数组输入时,返回各小数组组成的大数组

    1
    2
    3
    4
    5
    6
    7
    array_map( 'strtoupper', array( 'a' => 'hello', 'b' => 'world' ) );
    #Array
    #(
    # [a] => HELLO
    # [b] => WORLD
    #)
  2. array_reverse( <数组>, [ $preserve = true ] )
    将原数组中的元素顺序翻转,创建新的数组并返回
    $preserve 是否保留原有键名

    1
    2
    3
    4
    5
    6
    7
    array_reverse( array( 'a' => 1, 'b' => 2 ) );
    #Array
    #(
    # [b] => 2
    # [a] => 1
    #)
  3. array_walk( <数组>, <回调>, [ 可选参数 ] )
    依次对数组的元素进行回调
    @param <数组>取地址
    @param <回调>第一个参数为 item,第二个为 key
    @param [可选参数]会作为回调的第三个参数传递过去
    @return bool 操作成功则返回true
    注:不受<数组>内部指针的影响,顺序遍历不会遗漏

    1
    2
    3
    4
    5
    6
    function test( $item, $key, $prefix ){
    echo $prefix.':'.$key.':'.$item."\n";
    }
    array_walk( [ 'a' => 'apple', 'g' => 'google' ], 'test', 'company' );
    #company:a:apple
    #company:b:google
  4. call_user_func & call_user_func_array
    call_user_func( <回调函数>, [参数1], [参数2] )
    call_user_func_array( <回调函数>, [参数数组] )
    二者的区别在于:
    ① 前者参数不能引用传值,而后者可以
    ② 后者参数是数组

    1
    2
    3
    4
    5
    6
    call_user_func('回调函数名');
    call_user_func(__NAMESPACE__ .'\类名::方法名');
    call_user_func(array(__NAMESPACE__ .'\类名', '方法名'));
    call_user_func(<类的实例> .'::方法名');
    call_user_func(array(<类的实例>, '方法名'));
    call_user_func(<函数变量>)