PHP的基礎知識(三)
PHP的基礎知識(三)
一、url編碼
1、PHP中,我們經常用到urlencode()和urldecode()這一對針對url編碼和解碼的函式
urlencode的作用:
1)將字串編碼並將其用於 URL 的請求部分,同時它還便於將變數傳遞給下一頁。
2)經常用來編碼URL中的中文字串,避免在URL呼叫中出錯。
2、其實,還有另外一對函式rawurlencode()和rawurldecode()和上面講的函式作用是很相似的
urlencode和rawurlencode的區別主要在於對空格的處理:
1)urlencode 將空格則編碼為加號(+)
2)rawurlencode 將空格則編碼為加號(%20)
3、urlencode和rawurlencode這兩者在使用中如何選擇
1)如果與其他系統的互操作性很重要,使用rawurlencode
2)一個例外是遺留系統,它希望查詢字串遵循編碼為+而不是%20的空格的形式編碼樣式,在這種情況下,使用urlencode
總結: 一般情況下,建議使用rawurlencode()來對url進行編碼
二、比較兩個字串
如果要比較兩個字串是否相等,一般我們首先想到的是使用“===”來實現,其實這裡我們還可以用strcmp()函式來實現
我們來看下“===","==",strcmp(),strncmp()的區別
1、“===”和“==”的區別
“===”強調用於比較的兩個物件的值和型別都要相同,而“==”只要求值相同就可以了。之所以說是兩個物件,是因為他們不一定全部為字串,也能為整型等等
2、strcmp是二進位制安全的,用於區分大小寫 (即大小寫敏感)的字串比較。
3、那麼“二進位制安全”是什麼?
1)有二進位制安全的函式,那自然就有二進位制不安全的函式,比如strcoll()函式就是二進位制不安全的。
先看一段程式碼:
1 <?php 2 $string1 = "Hello"; 3 $string2 = "Hello\0Hello";4 echo strcoll($string1, $string2); /*返回0, 由於是非二進位制安全,誤判為相等 */ 5 echo PHP_EOL; 6 echo strcmp($string1, $string2); /*返回<0,不相等*/ 7 8 //輸出結果 9 //0 10 //-6
這是為什麼呢?PHP是基於C實現的,PHP程式碼都會被zend引擎編譯成opcode,最終作為C語言去執行。 而對於c語言‘\0’是字串的結束符,它讀到’\0’就會預設字元讀取已經結束,從而拋掉後面的字串。
2)再來看下二進位制安全的定義:
程式不會對其中的資料做任何限制、過濾、或者假設 —— 資料在寫入時是什麼樣的, 它被讀取時就是什麼樣。
PHP是如何實現二進位制安全的?
那麼,既然PHP是基於C實現的,C 字串型別不是二進位制安全的,PHP又是如何實現的呢?這就是資料結構的功勞了。 PHP的核心中,是如此定義字串型別的,如下圖:
其中,val是指向字串記憶體的指標,len表示該字串的長度,無論是否遇到“\0”字元,C都按照len長度讀取該字串。
三、call_user_func 與call_user_func_array
這兩個方法也是經常會用到的,先看下程式碼:
1 <?php 2 //大部分mvc框架,調起程式執行,都是基於這個思想 3 public function run() 4 { 5 $this->setReporting();//檢測開發環境 6 $route = new Router();//解析路由 7 //載入類 8 $controllerClass = 'App\\Controllers\\' . $route->controller; 9 if (!class_exists($controllerClass)) { 10 die('404,Controller not Found'); 11 } 12 $controller = new $controllerClass(); 13 $action = $route->action; 14 if (!method_exists($controller, $action)) { 15 die('404,Action not Found'); 16 } 17 //執行控制器裡面的方法 18 call_user_func_array(array($controller, $action), []); 19 }
參考連結:http://wuxinjie.github.io/php-02/