PHP基礎複習(五)——自定義函數及內部函數

前言

本系列文章主要是根據實戰視頻《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/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章