|
|
|
|
|
|
在php里當需要判斷一個字符串長度時,我們首先想到的是strlen()函數,不錯,strlen()返回的就是字符串的長度,這樣使用沒有任何問題。不過,如果要從php程序優化的角度來看,使用strlen()判斷字符串長度未免是最好的寫法。
程序的優化,需要經驗的積累,那是知識的沉淀,厚積薄發的體現。
有經驗的程序員發現,php判斷字符串長度,使用isset()在速度上比strlen()更快,執行效率更高。
因此,今天就分析一下strlen()和isset()這兩個函數。
PHP strlen() 函數
定義和用法
strlen() 函數返回字符串的長度。
語法
strlen(string)
參數:string
描述:必需。規定要檢查的字符串。
實例
<?php
echo strlen("Hello world!");
?>
輸出:
12
PHP isset() 函數
isset函數是檢測變量是否設置。
格式:
bool isset ( mixed var [, mixed var [, ...]] )
返回值:
若變量不存在則返回 FALSE
若變量存在且其值為NULL,也返回 FALSE
若變量存在且值不為NULL,則返回 TURE
同時檢查多個變量時,每個單項都符合上一條要求時才返回 TRUE,否則結果為 FALSE
如果已經使用 unset() 釋放了一個變量之后,它將不再是 isset()。若使用 isset() 測試一個被設置成 NULL 的變量,將返回 FALSE。同時要注意的是一個 NULL 字節("")并不等同于 PHP 的 NULL 常數。
警告:
isset() 只能用于變量,因為傳遞任何其它參數都將造成解析錯誤。若想檢測常量是否已設置,可使用defined() 函數。
實例:
<?php
$var = '';
if (isset($var)) {
print "This var is set set so I will print.";
}
// 在后邊的例子中,我們將使用 var_dump函數 輸出 isset() 的返回值。
$a = "test";
$b = "anothertest";
var_dump( isset($a) ); // TRUE
var_dump( isset ($a, $b) ); // TRUE
unset ($a);
var_dump( isset ($a) ); // FALSE
var_dump( isset ($a, $b) ); // FALSE
$foo = NULL;
var_dump( isset ($foo) ); // FALSE
?>
導讀:var_dump()和print_r()在斷點調試程序時的區別
isset()速度為什么比strlen()更快
strlen()函數函數執行起來相當快,因為它不做任何計算,只返回在zval 結構(C的內置數據結構,用于存儲PHP變量)中存儲的已知字符串長度。但是,由于strlen()是函數,多多少少會有些慢,因為函數調用會經過諸多步驟,如字母小寫化(譯注:指函數名小寫化,PHP不區分函數名大小寫)、哈希查找,會跟隨被調用的函數一起執行。
在某些情況下,使用isset() 技巧可以加速執行你的代碼。因為與isset()作為一種語言結構,意味著它的執行不需要函數查找和字母小寫化。也就是說,實際上在檢驗字符串長度的頂層代碼中你沒有花太多開銷。
舉例如下:
if (strlen($foo) < 5) { echo "Foo is too short"$$ }
if (!isset($foo{5})) { echo "Foo is too short"$$ }
調用isset()比strlen()快。
導讀:php isset和empty、==(等)和===(恒等)的區別
知識擴展
PHP String 函數
String 字符串函數允許您對字符串進行操作。
String 函數是 PHP 核心的組成部分。無需安裝即可使用這些函數。
| 函數 | 描述 | PHP版本 |
|---|---|---|
| addcslashes() | 在指定的字符前添加反斜杠。 | 4 |
| addslashes() | 在指定的預定義字符前添加反斜杠。 | 3 |
| bin2hex() | 把 ASCII 字符的字符串轉換為十六進制值。 | 3 |
| chop() | rtrim() 的別名。 | 3 |
| chr() | 從指定的 ASCII 值返回字符。 | 3 |
| chunk_split() | 把字符串分割為一連串更小的部分。 | 3 |
| convert_cyr_string() | 把字符由一種 Cyrillic 字符轉換成另一種。 | 3 |
| convert_uudecode() | 對 uuencode 編碼的字符串進行解碼。 | 5 |
| convert_uuencode() | 使用 uuencode 算法對字符串進行編碼。 | 5 |
| count_chars() | 返回字符串所用字符的信息。 | 4 |
| crc32() | 計算一個字符串的 32-bit CRC。 | 4 |
| crypt() | 單向的字符串加密法 (hashing)。 | 3 |
| echo() | 輸出字符串。 | 3 |
| explode() | 把字符串打散為數組。 | 3 |
| fprintf() | 把格式化的字符串寫到指定的輸出流。 | 5 |
| get_html_translation_table() | 返回翻譯表。 | 4 |
| hebrev() | 把希伯來文本從右至左的流轉換為左至右的流。 | 3 |
| hebrevc() | 同上,同時把(\n) 轉為 <br />。 | 3 |
| html_entity_decode() | 把 HTML 實體轉換為字符。 | 4 |
| htmlentities() | 把字符轉換為 HTML 實體。 | 3 |
| htmlspecialchars_decode() | 把一些預定義的 HTML 實體轉換為字符。 | 5 |
| htmlspecialchars() | 把一些預定義的字符轉換為 HTML 實體。 | 3 |
| implode() | 把數組元素組合為一個字符串。 | 3 |
| join() | implode() 的別名。 | 3 |
| levenshtein() | 返回兩個字符串之間的 Levenshtein 距離。 | 3 |
| localeconv() | 返回包含本地數字及貨幣信息格式的數組。 | 4 |
| ltrim() | 從字符串左側刪除空格或其他預定義字符。 | 3 |
| md5() | 計算字符串的 MD5 散列。 | 3 |
| md5_file() | 計算文件的 MD5 散列。 | 4 |
| metaphone() | 計算字符串的 metaphone 鍵。 | 4 |
| money_format() | 把字符串格式化為貨幣字符串。 | 4 |
| nl_langinfo() | 返回指定的本地信息。 | 4 |
| nl2br() | 在字符串中的每個新行之前插入 HTML 換行符。 | 3 |
| number_format() | 通過千位分組來格式化數字。 | 3 |
| ord() | 返回字符串第一個字符的 ASCII 值。 | 3 |
| parse_str() | 把查詢字符串解析到變量中。 | 3 |
| print() | 輸出一個或多個字符串。 | 3 |
| printf() | 輸出格式化的字符串。 | 3 |
| quoted_printable_decode() | 解碼 quoted-printable 字符串。 | 3 |
| quotemeta() | 在字符串中某些預定義的字符前添加反斜杠。 | 3 |
| rtrim() | 從字符串的末端開始刪除空白字符或其他預定義字符。 | 3 |
| setlocale() | 設置地區信息(地域信息)。 | 3 |
| sha1() | 計算字符串的 SHA-1 散列。 | 4 |
| sha1_file() | 計算文件的 SHA-1 散列。 | 4 |
| similar_text() | 計算兩個字符串的匹配字符的數目。 | 3 |
| soundex() | 計算字符串的 soundex 鍵。 | 3 |
| sprintf() | 把格式化的字符串寫寫入一個變量中。 | 3 |
| sscanf() | 根據指定的格式解析來自一個字符串的輸入。 | 4 |
| str_ireplace() | 替換字符串中的一些字符。(對大小寫不敏感) | 5 |
| str_pad() | 把字符串填充為新的長度。 | 4 |
| str_repeat() | 把字符串重復指定的次數。 | 4 |
| str_replace() | 替換字符串中的一些字符。(對大小寫敏感) | 3 |
| str_rot13() | 對字符串執行 ROT13 編碼。 | 4 |
| str_shuffle() | 隨機地打亂字符串中的所有字符。 | 4 |
| str_split() | 把字符串分割到數組中。 | 5 |
| str_word_count() | 計算字符串中的單詞數。 | 4 |
| strcasecmp() | 比較兩個字符串。(對大小寫不敏感) | 3 |
| strchr() | 搜索字符串在另一字符串中的第一次出現。strstr() 的別名 | 3 |
| strcmp() | 比較兩個字符串。(對大小寫敏感) | 3 |
| strcoll() | 比較兩個字符串(根據本地設置)。 | 4 |
| strcspn() | 返回在找到任何指定的字符之前,在字符串查找的字符數。 | 3 |
| strip_tags() | 剝去 HTML、XML 以及 PHP 的標簽。 | 3 |
| stripcslashes() | 刪除由 addcslashes() 函數添加的反斜杠。 | 4 |
| stripslashes() | 刪除由 addslashes() 函數添加的反斜杠。 | 3 |
| stripos() | 返回字符串在另一字符串中第一次出現的位置(大小寫不敏感) | 5 |
| stristr() | 查找字符串在另一字符串中第一次出現的位置(大小寫不敏感) | 3 |
| strlen() | 返回字符串的長度。 | 3 |
| strnatcasecmp() | 使用一種“自然”算法來比較兩個字符串(對大小寫不敏感) | 4 |
| strnatcmp() | 使用一種“自然”算法來比較兩個字符串(對大小寫敏感) | 4 |
| strncasecmp() | 前 n 個字符的字符串比較(對大小寫不敏感)。 | 4 |
| strncmp() | 前 n 個字符的字符串比較(對大小寫敏感)。 | 4 |
| strpbrk() | 在字符串中搜索指定字符中的任意一個。 | 5 |
| strpos() | 返回字符串在另一字符串中首次出現的位置(對大小寫敏感) | 3 |
| strrchr() | 查找字符串在另一個字符串中最后一次出現的位置。 | 3 |
| strrev() | 反轉字符串。 | 3 |
| strripos() | 查找字符串在另一字符串中最后出現的位置(對大小寫不敏感) | 5 |
| strrpos() | 查找字符串在另一字符串中最后出現的位置(對大小寫敏感) | 3 |
| strspn() | 返回在字符串中包含的特定字符的數目。 | 3 |
| strstr() | 搜索字符串在另一字符串中的首次出現(對大小寫敏感) | 3 |
| strtok() | 把字符串分割為更小的字符串。 | 3 |
| strtolower() | 把字符串轉換為小寫。 | 3 |
| strtoupper() | 把字符串轉換為大寫。 | 3 |
| strtr() | 轉換字符串中特定的字符。 | 3 |
| substr() | 返回字符串的一部分。 | 3 |
| substr_compare() | 從指定的開始長度比較兩個字符串。 | 5 |
| substr_count() | 計算子串在字符串中出現的次數。 | 4 |
| substr_replace() | 把字符串的一部分替換為另一個字符串。 | 4 |
| trim() | 從字符串的兩端刪除空白字符和其他預定義字符。 | 3 |
| ucfirst() | 把字符串中的首字符轉換為大寫。 | 3 |
| ucwords() | 把字符串中每個單詞的首字符轉換為大寫。 | 3 |
| vfprintf() | 把格式化的字符串寫到指定的輸出流。 | 5 |
| vprintf() | 輸出格式化的字符串。 | 4 |
| vsprintf() | 把格式化字符串寫入變量中。 | 4 |
| wordwrap() | 按照指定長度對字符串進行折行處理。 | 4 |
