您好,登錄后才能下訂單哦!
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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。