前言
本系列文章主要是根據實戰視頻《360大牛:全面解讀PHP面試》學習過程中記錄的學習筆記,期間也會加入查找資料和平時學習中學習到的知識。
變量的作用域
變量的作用域也稱變量的範圍,變量的範圍即它定義的上下文背景(也是它的生效範圍)。大部分的PHP變量只有一個單獨的範圍。這個單獨的範圍跨度同樣包含了include和require引入的文件。
在函數體內部引用外部變量,可以使用global關鍵字,$GLOBALS及其他超全局數組。
<?php
$outer = 'str'; //全局變量
function myfunc() {
global $outer;
echo $outer;
}
// 也可以使用$GLOBALS
$outer = 'str'; //全局變量
function myfunc() {
$outer = $GLOBALS['outer'];
echo $outer;
}
靜態變量
靜態變量僅在局部函數域中存在,當程序執行離開此作用域時,其值並不會消失。
static關鍵字
1.僅初始化一次;
2.初始化時需要賦值;
3.每次執行函數該值會保留;
4.static修飾的變量是局部的,僅在函數內部有效;
5.可以記錄函數的調用次數,從而可以在某些條件下終止遞歸。
函數的參數
默認情況下,函數參數通過值傳遞。
如果希望允許函數修改它的值,必須通過引用傳遞參數
函數的返回值
值通過使用可選的返回語句(return)返回。
可以返回包括數組和對象的任意類型。
返回語句會中止函數執行,將控制權交回函數調用處。
省略return ,返回值爲NULL,不可以有多個返回值。
函數的引用返回
從函數返回一個引用,必須在函數聲明和指派返回值給一個變量時都使用引用運算符&。
<?php
function &myfunc(){
static $b = 10; //若無static修飾,則$b是局部變量,當執行完函數會被回收
return $b;
}
$a = myfunc(); //$a=10
$a = &myfunc(); //$a=10
$a = 100;
echo myfunc(); //輸出100
外部文件的導入
include/require語句包含並運行指定文件。
如果給出路徑名則按照路徑來查找,否則從include_path中查找;如果include_path中沒有找到,則從調用腳本文件所在的目錄和當前工作目錄下查找。
當一個文件被包含時,其中所包含的代碼繼承了include所在行的變量範圍。
加載過程中未找到文件則include結構會發出一條警告;而require此時會發出一個致命錯誤。
require在出錯時產生E_COMPILE_ERROR級別的錯誤。這將會導致腳本中止,而include只產生警告(E_WARNING),腳本會繼續運行。
require(include)/require_once(include_once)唯一區別是PHP會檢查該文件是否已經被包含過,如果被包含過則不會再次包含。
系統內置函數
時間日期函數
date() 格式化一個本地時間/日期
string date ( string $format [, int $timestamp ] )
返回將整數 timestamp 按照給定的格式字串而產生的字符串。如果沒有給出時間戳則使用本地當前時間。換句話說,timestamp 是可選的,默認值爲 time()。
例子:
<?php
echo date('Y-m-d H:i:s'); //2018-12-04 16:15:35
strtotime() 將任何字符串的日期時間描述解析爲 Unix 時間戳
int strtotime ( string $time [, int $now = time() ] )
接受一個包含美國英語日期格式的字符串並嘗試將其解析爲 Unix 時間戳(自 January 1 1970 00:00:00 GMT 起的秒數),其值相對於 now 參數給出的時間,如果沒有提供此參數則用系統當前時間。
例子:
<?php
echo strtotime("+1 week 2 days 4 hours 2 seconds"); //1544703602
mktime() 取得一個日期的 Unix 時間戳
int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )
根據給出的參數返回 Unix 時間戳。
例子:
<?php
echo mktime(); //1543912036
time() 返回當前的 Unix 時間戳
int time ( void )
例子:
<?php
echo time(); //1568556893
microtime() 返回當前 Unix 時間戳和微秒數
mixed microtime ([ bool $get_as_float ] )
例子:
<?php
list($usec, $sec) = explode(" ", microtime());
echo ((float)$usec + (float)$sec); // 1543912351.4336
date_default_timezone_set() 設定用於一個腳本中所有日期時間函數的默認時區
bool date_default_timezone_set ( string $timezone_identifier )
如果 timezone_identifier 參數無效則返回 FALSE,否則返回 TRUE。
例子:
<?php
date_default_timezone_set('Asia/Shanghai');
$tz = date_default_timezone_get();
echo $tz; //Asia/Shanghai
IP處理函數
ip2long() 將 IPV4 的字符串互聯網協議轉換成長整型數字
int ip2long ( string $ip_address )
返回 IPV4 網絡地址的長整型格式,從標準網絡地址格式(點字符串)轉化得到。返回IP地址轉換後的數字 或 FALSE 如果 ip_address 是無效的。
例子:
<?php
$ip = gethostbyname('www.baidu.com');
$long = ip2long($ip);
if ($long == -1 || $long === FALSE) {
echo 'Invalid IP, please try again';
} else {
echo $ip . "\n"; // 180.97.33.107
echo $long . "\n"; // 3026264427
printf("%u\n", ip2long($ip)); // 3026264427
}
long2ip() 將長整型轉化爲字符串形式帶點的互聯網標準格式地址(IPV4)
string long2ip ( int $proper_address )
通過長整型的表達形式轉化生成帶點格式的互聯網地址(例如:aaa.bbb.ccc.ddd )。
例子:
<?php
echo long2ip(3026264427); //180.97.33.107
打印處理
print() 輸出字符串
int print ( string $arg )
輸出 arg。print 實際上不是函數(而是語言結構),所以可以不用圓括號包圍參數列表。和 echo 最主要的區別: print 僅支持一個參數,並總是返回 1。
printf() 輸出格式化字符串
int printf ( string $format [, mixed $args [, mixed $... ]] )
依據 format 格式參數產生輸出。
例子:
<?php
$num = 5;
$location = 'tree';
$format = 'There are %d monkeys in the %s';
echo printf($format, $num, $location); //There are 5 monkeys in the tree31
print_r() 以易於理解的格式打印變量。
mixed print_r ( mixed $expression [, bool $return = FALSE ] )
以人類易讀的格式顯示一個變量的信息。
print_r()、 var_dump()、 var_export() 都會顯示對象 protected 和 private 的屬性。 Class 的靜態屬性(static) 則不會顯示。
例子:
<?php
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x', 'y', 'z'));
print_r ($a); //Array ( [a] => apple [b] => banana [c] => Array ( [0] => x [1] => y [2] => z ) )
echo 輸出一個或多個字符串
void echo ( string $arg1 [, string $... ] )
輸出所有參數。不會換行。
echo 不是一個函數(它是一個語言結構), 因此你不一定要使用小括號來指明參數,單引號,雙引號都可以。 echo (不像其他語言構造)不表現得像一個函數, 所以不能總是使用一個函數的上下文。 另外,如果你想給echo 傳遞多個參數, 那麼就不能使用小括號。
sprintf() 跟printf()類似
string sprintf ( string $format [, mixed $... ] )
var_dump() 打印變量的相關信息
void var_dump ( mixed $expression [, mixed $... ] )
顯示關於一個或多個表達式的結構信息,包括表達式的類型與值。數組將遞歸展開值,通過縮進顯示其結構。
例子:
<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
var_export() 輸出或返回一個變量的字符串表示
mixed var_export ( mixed $expression [, bool $return ] )
通過將函數的第二個參數設置爲 TRUE,從而返回變量的表示。
例子:
<?php
$a = array (1, 2, array ("a", "b", "c"));
var_export ($a); //array ( 0 => 1, 1 => 2, 2 => array ( 0 => 'a', 1 => 'b', 2 => 'c', ), )
$b = 3.1;
$v = var_export($b, TRUE);
echo $v; //3.1
序列化及反序列化函數
serialize() 產生一個可存儲的值的表示
string serialize ( mixed $value )
返回字符串,此字符串包含了表示 value 的字節流,可以存儲於任何地方。
這有利於存儲或傳遞 PHP 的值,同時不丟失其類型和結構。
serialize() 可處理除了 resource 之外的任何類型。甚至可以 serialize() 那些包含了指向其自身引用的數組。你正 serialize() 的數組/對象中的引用也將被存儲。
當序列化對象時,PHP 將試圖在序列動作之前調用該對象的成員函數 __sleep()。這樣就允許對象在被序列化之前做任何清除操作。類似的,當使用 unserialize() 恢復對象時, 將調用 __wakeup() 成員函數。
unserialize() 從已存儲的表示中創建 PHP 的值
mixed unserialize ( string $str )
對單一的已序列化的變量進行操作,將其轉換回 PHP 的值。若被解序列化的變量是一個對象,在成功地重新構造對象之後,PHP 會自動地試圖去調用 __wakeup() 成員函數(如果存在的話)。
字符串處理函數
implode() 將一個一維數組的值轉化爲字符串.
string implode ( string $glue , array $pieces )
string implode ( array $pieces )
用 glue 將一維數組的值連接爲一個字符串。
$glue默認爲空的字符串 $pieces 想要轉換的數組.
例子:
<?php
$array = array('lastname', 'email', 'phone');
$str = implode(",", $array);
echo $str; //lastname,email,phone
explode() 使用一個字符串分割另一個字符串
array explode ( string $delimiter , string $string [, int $limit ] )
此函數返回由字符串組成的數組,每個元素都是 string 的一個子串,它們被字符串 delimiter 作爲邊界點分割出來。
delimiter邊界上的分隔字符。string輸入的字符串。limit如果設置了 limit 參數並且是正數,則返回的數組包含最多 limit 個元素,而最後那個元素將包含 string 的剩餘部分。如果 limit 參數是負數,則返回除了最後的 -limit 個元素外的所有元素。如果 limit 是 0,則會被當做 1。
join() 此函數是該函數的別名: implode().
strrev() 反轉字符串
string strrev ( string $string )
返回 string 反轉後的字符串。
trim() 去除字符串首尾處的空白字符(或者其他字符)
string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )
返回字符串 str 去除首尾空白字符後的結果。如果不指定第二個參數,trim() 將去除這些字符:
" " ,普通空格符。"\t" ,製表符。"\n",換行符。"\r" ,回車符。"\0" ,空字節符。"\x0B",垂直製表符。
ltrim() 刪除字符串開頭的空白字符(或其他字符)
string ltrim ( string $str [, string $character_mask ] )
rtrim() 刪除字符串末端的空白字符(或者其他字符)
string rtrim ( string $str [, string $character_mask ] )
strstr() 查找字符串的首次出現
string strstr ( string $haystack , mixed $needle [, bool $before_needle = FALSE ] )
返回 haystack 字符串從 needle 第一次出現的位置開始到 haystack 結尾的字符串。(該函數區分大小寫。如果想要不區分大小寫,請使用 stristr()。)
haystack輸入字符串。如果 needle 不是一個字符串,那麼它將被轉化爲整型並且作爲字符的序號來使用。before_needle若爲 TRUE,strstr() 將返回 needle 在 haystack 中的位置之前的部分。
例子:
<?php
$email = '[email protected]';
$domain = strstr($email, '@');
echo $domain; // 打印 @example.com
$user = strstr($email, '@', true); // 從 PHP 5.3.0 起
echo $user; // 打印 name
number_format() 以千位分隔符方式格式化一個數字
string number_format ( float $number [, int $decimals = 0 ] )
string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )
本函數可以接受1個、2個或者4個參數(注意:不能是3個):
如果只提供第一個參數,number的小數部分會被去掉 並且每個千位分隔符都是英文小寫逗號","
如果提供兩個參數,number將保留小數點後的位數到你設定的值,其餘同樓上
如果提供了四個參數,number 將保留decimals個長度的小數部分, 小數點被替換爲dec_point,千位分隔符替換爲thousands_sep 。
<?php
$number = 1234.56;
$english_format_number = number_format($number);// 1,235
$nombre_format_francais = number_format($number, 2, ',', ' ');// 1 234,56
$number = 1234.5678;
$english_format_number = number_format($number, 2, '.', '');// 1234.57
數組處理函數
array_keys() 返回數組中部分的或所有的鍵名
array array_keys ( array $array [, mixed $search_value = null [, bool $strict = false ]] )
array_keys() 返回 input 數組中的數字或者字符串的鍵名。
如果指定了可選參數 search_value,則只返回該值的鍵名。否則 input 數組中的所有鍵名都會被返回。
例子:
<?php
$array = array(0 => 100, "color" => "red");
print_r(array_keys($array)); //Array ( [0] => 0 [1] => color )
$array = array("blue", "red", "green", "blue", "blue");
print_r(array_keys($array, "blue")); //Array ( [0] => 0 [1] => 3 [2] => 4 )
$array = array("color" => array("blue", "red", "green"),
"size" => array("small", "medium", "large"));
print_r(array_keys($array)); //Array ( [0] => color [1] => size )
array_values() 返回數組中所有的值
array array_values ( array $array )
返回 input 數組中所有的值並給其建立數字索引。
例子:
<?php
$array = array("size" => "XL", "color" => "gold");
print_r(array_values($array)); //Array ( [0] => XL [1] => gold )
array_diff() 計算數組的差集
array array_diff ( array $array1 , array $array2 [, array $... ] )
對比 array1 和其他一個或者多個數組,返回在 array1 中但是不在其他 array 裏的值。
例子:
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
print_r($result);//Array ( [1] => blue )
array_intersect() 計算數組的交集
array array_intersect ( array $array1 , array $array2 [, array $... ] )
返回一個數組,該數組包含了所有在 array1 中也同時出現在所有其它參數數組中的值。注意鍵名保留不變。
例子:
<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
print_r($result); //Array ( [a] => green [0] => red )
array_merge() 合併一個或多個數組
array array_merge ( array $array1 [, array $... ] )
將一個或多個數組的單元合併起來,一個數組中的值附加在前一個數組的後面。返回作爲結果的數組。
如果輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。
如果只給了一個數組並且該數組是數字索引的,則鍵名會以連續方式重新索引。
例子:
<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result); //Array ( [color] => green [0] => 2 [1] => 4 [2] => a [3] => b [shape] => trapezoid [4] => 4 )
array_shift() 將數組開頭的單元移出數組
mixed array_shift ( array &$array )
將 array 的第一個單元移出並作爲結果返回,將 array 的長度減一併將所有其它單元向前移動一位。所有的數字鍵名將改爲從零開始計數,文字鍵名將不變。使用此函數後會重置(reset())array 指針。返回移出的值,如果 array 爲 空或不是一個數組則返回 NULL。
array_unshift() 在數組開頭插入一個或多個單元
int array_unshift ( array &$array [, mixed $... ] )
將傳入的單元插入到 array 數組的開頭。注意單元是作爲整體被插入的,因此傳入單元將保持同樣的順序。所有的數值鍵名將修改爲從零開始重新計數,所有的文字鍵名保持不變。
例子:
<?php
$queue = array("orange", "banana");
array_unshift($queue, "apple", "raspberry");
print_r($queue); //Array ( [0] => apple [1] => raspberry [2] => orange [3] => banana )
array_pop() 彈出數組最後一個單元(出棧)
mixed array_pop ( array &$array )
array_pop() 彈出並返回 array 數組的最後一個單元,並將數組 array 的長度減一。使用此函數後會重置(reset())array 指針。返回 array 的最後一個值。如果 array 是空(如果不是一個數組),將會返回 NULL 。
array_push() 將一個或多個單元壓入數組的末尾(入棧)
int array_push ( array &$array , mixed $value1 [, mixed $... ] )
將 array 當成一個棧,並將傳入的變量壓入 array 的末尾。array 的長度將根據入棧變量的數目增加。和如下效果相同:
$array[] = $var;
例子:
<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack); //Array ( [0] => orange [1] => banana [2] => apple [3] => raspberry )
sort() 對數組排序
bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
對數組進行排序。當本函數結束時數組單元將被從最低到最高重新安排。
array要排序的數組。
sort_flags可選的第二個參數 sort_flags 可以用以下值改變排序的行爲:
排序類型標記:
SORT_REGULAR - 正常比較單元(不改變類型)
SORT_NUMERIC - 單元被作爲數字來比較
SORT_STRING - 單元被作爲字符串來比較
SORT_LOCALE_STRING - 根據當前的區域(locale)設置來把單元當作字符串比較,可以用 setlocale() 來改變。
SORT_NATURAL - 和 natsort() 類似對每個單元以“自然的順序”對字符串進行排序。 PHP 5.4.0 中新增的。
SORT_FLAG_CASE - 能夠與 SORT_STRING 或 SORT_NATURAL 合併(OR 位運算),不區分大小寫排序字符串。
參考鏈接:http://php.net/manual/zh/