1. 程式人生 > 實用技巧 >PHP的基礎知識(三)

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/