php容易弄不明白的知识点有哪些

发布时间:2021-10-11 10:43:03 作者:柒染
来源:亿速云 阅读:126

php容易弄不明白的知识点有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、类中self和static的区别以及什么是后期静态绑定(late static buildings)

    self是用来调用本代码所在类中的内容,而static是用来调用实例中的类的内容。

    测试代码如下:

<?php
class A {
    public static function who() {
        echo __CLASS__;
        echo '<br>';
    }
    public static function test() {
        static::who(); // 后期静态绑定从这里开始
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__."\n";
    }
}

B::test();

二、ini_set用于设置当前程序中的php配置,替换php.ini中内容,仅用于当前程序。

三、const 和 define 的根本区别在于,const 在编译时定义常量,而 define 在运行时定义常量

const FOO = 'BAR';
define('FOO', 'BAR');

// but
if (...) {
    const FOO = 'BAR';    // 无效
}
if (...) {
    define('FOO', 'BAR'); // 有效
}

四、isset($a['test'])最好用array_key_exists('test',$a),因为当$a['test']=null时,isset($a['test'])会返回false

五、try{} catch(Exception $e){} finally{},无论有无出错finally中的内容都会执行,即使有return,最终也是执行finally中的return。

六、判断 PHP 数组是否是关联数组的方法

function has_string_keys(array $array) {
  return count(array_filter(array_keys($array), 'is_string')) > 0;
}

七、===运算符返回值,当两边是对象的时候,即使一个对象是另一个对象的clone,也不相等,必须两个对象指向的地址相同才相等,但如果是一般变量,只要变量类型和值相等即可。

$a = new stdClass();
$a->foo = "bar";
$b = clone $a;
var_dump($a === $b);//false
$c = 10;
$d = 10;
var_dump($c === $d);//true

八、==号要慎重使用,如果一边是字符串一边是数字时就容易产生问题

$a = 0;
echo ('pa' == $a) ? 'true' : 'false';//true
$b = 1;
echo ('1cedd' == $b) ? 'true' : 'false';//true

九、array_map、array_walk、array_filter,三个对数组内容过滤或者重新计算非常好的函数。

/*array_map示例,返回用自定义函数处理完的数组*/
$func = function($value) {
    return $value * 2;
};

print_r(array_map($func, range(1, 5)));

$func2 = function($a,$b) {
    return $a * $b;
};
//如果有多个数组传入,则每个数组中取同样key的值作为参数
print_r(array_map($func2, range(1, 5),range(10, 50)));

/*array_walk示例,对传入数组中的每一个值使用自定义函数处理,函数的前两个参数是value,key
*还有一个array_walk_recursive递归对数组中的每个变量使用自定义函数*/
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");

function test_alter(&$item1, $key, $prefix)
{
    $item1 = "$prefix: $item1";//此处改变了原数组中的值
}

function test_print($item2, $key)
{
    echo "$key. $item2<br />\n";
}

echo "Before ...:\n";
array_walk($fruits, 'test_print');

array_walk($fruits, 'test_alter', 'fruit');
echo "... and after:\n";

array_walk($fruits, 'test_print');
/*array_filter,返回符合自定义数组条件的变量数组,如果不传入函数变量,则返回数组中值不为0,'0',false,null值的变量*/
function odd($var)
{
    // 返回输入整数是否为奇数(单数)
    return $var & 1;
}
function even($var)
{
    // 返回输入整数是否为偶数
    return !($var & 1);
}
$array1 = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5];
$array2 = [6, 7, 8, 9, 10, 11, 12];
echo "Odd :\n";
print_r(array_filter($array1, "odd"));
echo "Even:\n";
print_r(array_filter($array2, "even"));
//不应该在回调函数中改变数组(如:添加、删除或销毁“unset”当前数组和里面的元素),否则此函数的行为将不可预测。

十、php是没有函数重载功能的,php的函数是基于其名称而不包括参数,但是可以使用func_num_args()  func_get_arg() func_num_args()这三个函数来实现类似函数重载的功能。

function foo()
{
    $numargs = func_num_args();
    echo "Number of arguments: $numargs<br />\n";
    if ($numargs >= 2) {
        echo "Second argument is: " . func_get_arg(1) . "<br />\n";
    }
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
    }
}

foo(1, 2, 3);

看完上述内容,你们掌握php容易弄不明白的知识点有哪些的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. C++ 容易犯的错误和容易忘记的知识点(一)
  2. Vue中容易被忽视的知识点有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php

上一篇:如何使用vbs禁止QQ上网

下一篇:如何把竖屏视频改成横屏视频

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》