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容易弄不明白的知识点有哪些的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。