成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

搞定PHP面試 - 函數(shù)知識點整理

SimpleTriangle / 3169人閱讀

摘要:使用中文函數(shù)名和變量名面積長寬長寬面積合法,輸出中文符號函數(shù)名。類型聲明類型聲明允許函數(shù)在調(diào)用時要求參數(shù)為特定類型。需要使用自己的包裝函數(shù)來將這些結構用作可變函數(shù)。匿名函數(shù)目前是通過類來實現(xiàn)的。

一、函數(shù)的定義 1. 函數(shù)的命名規(guī)則 函數(shù)名可以包含字母、數(shù)字、下劃線,不能以數(shù)字開頭。
function Func_1(){ } //合法
function func1(){ } //合法
function _func1(){ } //合法
function Func-1(){ } // 非法,不能包含 "-"
function 1_func(){ }// 非法,不能以數(shù)字開頭
在此所說的字母是 a-z,A-Z,以及 ASCII 字符從 127 到 255(0x7f-0xff)。
因此實際上使用中文變量名也是合法的。
甚至使用中文的標點符號作為變量名都是合法的。
只是一般都不推薦這樣用。
// 使用中文函數(shù)名和變量名
function 面積($長, $寬){ 
    return $長 * $寬;
}

echo 面積(2, 3); // 合法,輸出 "6"

// 中文符號函數(shù)名
function ??!?){ 
    return "中文符號";
}

echo ??!?); // 合法,輸出 "中文符號"
函數(shù)名不區(qū)分大小寫
function Func(){ 
    return "Func";
}

echo func(); // 輸出 "Func"

函數(shù)名不區(qū)分大小寫,不過在調(diào)用函數(shù)的時候,使用其在定義時相同的形式是個好習慣。

2. 函數(shù)的特性 任何有效的 PHP 代碼都有可能出現(xiàn)在函數(shù)內(nèi)部,甚至包括其它函數(shù)和類定義。

函數(shù)中包含其他函數(shù)

function foo()
{
  function bar()
  {
    echo "I don"t exist until foo() is called.";
  }
}

/* 現(xiàn)在還不能調(diào)用bar()函數(shù),因為它還不存在 */
foo();

/* 現(xiàn)在可以調(diào)用bar()函數(shù)了,因為foo()函數(shù)的執(zhí)行使得bar()函數(shù)變?yōu)橐讯x的函數(shù) */
bar(); // 輸出 "I don"t exist until foo() is called."

函數(shù)中包含類

function foo()
{
  class Bar{
      public $a = 1;
  }
}

/* 現(xiàn)在還不能實例化 Bar 類,因為它還不存在 */
foo();

$bar = new Bar();

echo $bar->a; // 輸出 "1"
PHP 中的所有函數(shù)和類都具有全局作用域,可以定義在一個函數(shù)之內(nèi)而在之外調(diào)用,反之亦然。
示例見上面兩個例子
函數(shù)無需在調(diào)用之前被定義,但是必須保證函數(shù)定義的代碼能夠被執(zhí)行到
foo(); // 輸出 "foo"

function foo()
{
  echo "foo";
}

定義 foo() 函數(shù)的代碼不會被執(zhí)行

foo(); // PHP Fatal error:  Uncaught Error: Call to undefined function foo()

if (false) {
    function foo()
    {
      echo "foo";
    }
}
PHP 不支持函數(shù)重載,也不可能取消定義或者重定義已聲明的函數(shù)。
function foo(){
    echo 0;
}

function foo() {
    echo 1;
} 
// PHP Fatal error:  Cannot redeclare foo() (previously declared
PHP 中可以調(diào)用遞歸函數(shù)
function recursion($a)
{
    if ($a <= 5) {
        echo "$a
";
        recursion($a + 1);
    }
}
echo recursion(0);

輸出

0
1
2
3
4
5
要避免遞歸函數(shù)/方法調(diào)用超過 100-200 層,因為可能會使堆棧崩潰從而使當前腳本終止。 無限遞歸可視為編程錯誤。

遞歸次數(shù)過多

function recursion($a)
{
    if ($a <= 300) {
        echo "$a
";
        recursion($a + 1);
    }
}
echo recursion(0);
// PHP Fatal error:  Uncaught Error: Maximum function nesting level of "256" reached, aborting! 
PHP 的函數(shù)支持參數(shù)默認值
function square($num = 0)
{
    echo $num * $num;
}
echo square(3), "
";
echo square(), "
";

輸出

9
0
PHP 的函數(shù)支持可變數(shù)量的參數(shù)(PHP 5.6+)
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1);    // 輸出 1
echo sum(1, 2);    // 輸出 3
echo sum(1, 2, 3); // 輸出6
二、函數(shù)的參數(shù)

通過參數(shù)列表可以傳遞信息到函數(shù),多個參數(shù)之間以逗號作為分隔符。參數(shù)是從左向右求值的。

PHP 支持通過值傳遞參數(shù)(默認),通過引用傳遞參數(shù)以及參數(shù)默認值。也支持可變長度的參數(shù)列表。

1. 通過值傳遞參數(shù)(默認)

默認情況下,函數(shù)參數(shù)通過值傳遞,即使在函數(shù)內(nèi)部改變參數(shù)的值,它并不會改變函數(shù)外部的值。

function addition($num)
{
    $num++;
}

$num = 1;
addition($num); 

echo $num; // 輸出 1
2. 通過引用傳遞參數(shù)

如果希望函數(shù)可以修改傳入的參數(shù)值,必須通過引用傳遞參數(shù)。

如果希望函數(shù)的一個參數(shù)通過引用傳遞,可以在定義函數(shù)時該參數(shù)的前面加上符號 &。

function addition(& $num)
{
    $num++;
}

$num = 1;
addition($num); 

echo $num; // 輸出 2
使用引用傳遞參數(shù),調(diào)用函數(shù)是只能傳變量,不能直接傳值。
function addition(& $num)
{
    $num++;
}

addition(1); // PHP Fatal error:  Only variables can be passed by reference 
3. 參數(shù)默認值 函數(shù)可以定義 C++ 風格的標量參數(shù)默認值
function makecoffee($type = "cappuccino")
{
    return "Making a cup of $type.
";
}
echo makecoffee(); // Making a cup of cappuccino.
echo makecoffee(null); // Making a cup of .
echo makecoffee("espresso"); // Making a cup of espresso.
PHP 還允許使用數(shù)組 array 和特殊類型 NULL 作為默認參數(shù)
function makecoffee($types = ["cappuccino"], $coffeeMaker = NULL)
{
    $device = is_null($coffeeMaker) ? "hands" : $coffeeMaker;
    return "Making a cup of ".join(", ", $types)." with $device.
";
}
echo makecoffee(); // Making a cup of cappuccino with hands.
echo makecoffee(["cappuccino", "lavazza"], "teapot"); // Making a cup of cappuccino, lavazza with teapot.
默認值必須是常量表達式,不能是諸如變量,類成員,或者函數(shù)調(diào)用等。 默認參數(shù)必須放在任何非默認參數(shù)的右側;否則,函數(shù)將不會按照預期的情況工作。
function makecoffee($type = "cappuccino", $coffeeMaker)
{
    return "Making a cup of {$type} with {$coffeeMaker}.";
}

echo makecoffee(null, "Jack"); // Making a cup of  with Jack.

echo makecoffee("Jack"); // PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function makecoffee(), 1 passed in XX and exactly 2 expected in XX
4. 類型聲明

類型聲明允許函數(shù)在調(diào)用時要求參數(shù)為特定類型。 如果給出的值類型不對,那么將會產(chǎn)生一個錯誤: 在PHP 5中,這將是一個可恢復的致命錯誤,而在PHP 7中將會拋出一個TypeError異常。

為了指定一個類型聲明,類型應該加到參數(shù)名前。這個聲明可以通過將參數(shù)的默認值設為NULL來實現(xiàn)允許傳遞NULL。

有效的類型聲明
類型 描述 最小PHP版本
Class/interface name 該參數(shù)必須是給定類或接口的實例(instanceof)。 PHP 5.0.0
self 參數(shù)必須是當前方法所在類的實例(instanceof)。只能在類和實例方法上使用。 PHP 5.0.0
array 參數(shù)必須是數(shù)組(array) PHP 5.1.0
callable 參數(shù)必須是有效的 callable PHP 5.4.0
bool 參數(shù)必須是布爾值 PHP 7.0.0
float 參數(shù)必須是浮點數(shù) PHP 7.0.0
int 參數(shù)必須是整數(shù) PHP 7.0.0
string 參數(shù)必須是字符串 PHP 7.0.0
5. 嚴格類型

默認情況下,如果能做到的話,PHP將會強迫錯誤類型的值轉為函數(shù)期望的標量類型。
例如,一個函數(shù)的一個參數(shù)期望是string,但傳入的是integer,最終函數(shù)得到的將會是一個string類型的值。

function toString(string $var)
{
    return $var;
}

var_dump(toString(1)); // string(1) "1"

可以基于每一個文件開啟嚴格模式。
在嚴格模式中,只有一個與類型聲明完全相符的變量才會被接受,否則將會拋出一個TypeError。 唯一的一個例外是可以將integer傳給一個期望float的函數(shù)。

可以使用 declare 語句和strict_types 聲明來啟用嚴格模式:啟用嚴格模式同時也會影響返回值類型聲明。

declare(strict_types=1);

function toString(string $var)
{
    return $var;
}

toString(1); // PHP Fatal error:  Uncaught TypeError: Argument 1 passed to toString() must be of the type string, integer given

將integer傳給一個期望float的函數(shù)

declare(strict_types=1);

function toFloat(float $var)
{
    return $var;
}

$int = 1;
var_dump($int); // int(1)
var_dump(toFloat($int)); // double(1)
嚴格類型適用于在啟用嚴格模式的文件內(nèi)的函數(shù)調(diào)用,而不是在那個文件內(nèi)聲明的函數(shù)。一個沒有啟用嚴格模式的文件內(nèi)調(diào)用了一個在啟用嚴格模式的文件中定義的函數(shù),那么將會遵循調(diào)用者的偏好(弱類型),而這個值將會被轉換。

嚴格類型僅用于標量類型聲明,也正是因為如此,才需要PHP 7.0.0 或更新版本,因為標量類型聲明也是在這個版本中添加的。

6. 可變數(shù)量的參數(shù)列表(PHP 5.5+)

PHP 在用戶自定義函數(shù)中支持可變數(shù)量的參數(shù)列表。在 PHP 5.6 及以上的版本中,由 ... 語法實現(xiàn);在 PHP 5.5 及更早版本中,使用函數(shù) func_num_args(),func_get_arg(),和 func_get_args() 實現(xiàn)。

... (in PHP 5.6+)
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1);    // 輸出 1
echo sum(1, 2);    // 輸出 3
echo sum(1, 2, 3); // 輸出6
func_num_args()func_get_arg()func_get_args()(PHP 5.5)
function sum() {
    $acc = 0;
    foreach (func_get_args() as $n) {
        $acc += $n;
    }
    return $acc;
}

echo sum(1);    // 輸出 1
echo sum(1, 2);    // 輸出 3
echo sum(1, 2, 3); // 輸出6
三、函數(shù)返回值 1. 函數(shù)返回值的特性

值通過使用可選的返回語句(return)返回

可以返回包括數(shù)組和對象的任意類型。

返回語句會立即中止函數(shù)的運行,并且將控制權交回調(diào)用該函數(shù)的代碼行。

函數(shù)不能返回多個值,但可以通過返回一個數(shù)組來得到類似的效果。

如果省略了 return,則返回值為 NULL。

function sum($a, $b) {
    $a + $b;
}

var_dump(sum(1, 2)); // NULL
2. return語句

如果在一個函數(shù)中調(diào)用 return 語句,將立即結束此函數(shù)的執(zhí)行并將它的參數(shù)作為函數(shù)的值返回。
return 也會終止 eval() 語句或者腳本文件的執(zhí)行。

$expression = "echo "我在return之前"; return; echo "我在return之后";";

eval($expression); // 輸出“我在return之前”

如果在全局范圍中調(diào)用 return,則當前腳本文件中止運行。
如果在主腳本文件中調(diào)用 return,則腳本中止運行。
如果當前腳本文件是被 include 或者 require 的,則控制交回調(diào)用文件。此外,return 的值會被當作 include 或者 require 調(diào)用的返回值。

a.php


b.php


c.php


運行 a.php,輸出結果為:

我是b.php
我是c.php

如果當前腳本文件是在 php.ini 中的配置選項 auto_prepend_file 或者 auto_append_file 所指定的,則此腳本文件中止運行。

Note: 注意既然 return 是語言結構而不是函數(shù),因此其參數(shù)沒有必要用括號將其括起來。通常都不用括號,實際上也應該不用,這樣可以降低 PHP 的負擔。

Note: 如果沒有提供參數(shù),則一定不能用括號,此時返回 NULL。如果調(diào)用 return 時加上了括號卻又沒有參數(shù)會導致解析錯誤。

Note: 當用引用返回值時永遠不要使用括號,這樣行不通。只能通過引用返回變量,而不是語句的結果。如果使用 return ($a); 時其實不是返回一個變量,而是表達式 ($a) 的值(當然,此時該值也正是 $a 的值)。

3. 函數(shù)的引用返回

從函數(shù)返回一個引用,必須在函數(shù)聲明和指派返回值給一個變量時,都使用引用運算符 &

function &myFunc()
{
    static $b = 10;
    return $b;
}

$a = myFunc();
$a = 100;
echo myFunc(); // 10;

$a = &myFunc();
$a = 100;
echo myFunc(); // 100;
四、可變函數(shù)

PHP 支持可變函數(shù)的概念。
這意味著如果一個變量名后有圓括號,PHP 將尋找與變量的值同名的函數(shù),并且嘗試執(zhí)行它。
可變函數(shù)可以用來實現(xiàn)包括回調(diào)函數(shù),函數(shù)表在內(nèi)的一些用途。

可變函數(shù)不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及類似的語言結構。
需要使用自己的包裝函數(shù)來將這些結構用作可變函數(shù)。

function foo() {
    return "I"m foo()
";
}

// 使用 echo 的包裝函數(shù)
function echoit($string)
{
    echo $string;
}

$func = "foo";
echo $func();   // This calls foo(),輸出“I"m foo()”

$func = "echoit";
$func($func);  // This calls echoit(),輸出“echoit”


$func = "echo";

echo($func); // 輸出“echo”

$func($func); // PHP Fatal error:  Uncaught Error: Call to undefined function echo()

可以用可變函數(shù)的語法來調(diào)用一個對象的方法

class Foo
{
    function variable()
    {
        $name = "bar";
        $this->$name(); // This calls the Bar() method
    }

    function bar()
    {
        echo "This is Bar";
    }
}

$foo = new Foo();
$funcName = "variable";
$foo->$funcName();   // This calls $foo->variable(),輸出“This is Bar”

當調(diào)用靜態(tài)方法時,函數(shù)調(diào)用要比靜態(tài)屬性優(yōu)先

class Foo
{
    static $variable = "static property";
    static function variable()
    {
        echo "Method Variable called";
    }
}

echo Foo::$variable; // 輸出 "static property".
$variable = "variable";
Foo::$variable();  // 調(diào)用 $foo->variable(),輸出“Method Variable called”

可以調(diào)用存儲在標量內(nèi)的 callable(PHP 5.4+)

class Foo
{
    static function bar()
    {
        echo "bar
";
    }

    function baz()
    {
        echo "baz
";
    }
}

$func = ["Foo", "bar"];
$func(); // 輸出 "bar"

$func = [new Foo, "baz"];
$func(); // 輸出 "baz"

$func = "Foo::bar";
$func(); // 自 PHP 7.0.0 版本起會輸出 "bar"; 在此之前的版本會引發(fā)致命錯誤
五、匿名函數(shù) 1. 匿名函數(shù)的特性

匿名函數(shù)(Anonymous functions),也叫閉包函數(shù)(closures),允許 臨時創(chuàng)建一個沒有指定名稱的函數(shù)。
最經(jīng)常用作回調(diào)函數(shù)(callback)參數(shù)的值。

匿名函數(shù)目前是通過 Closure 類來實現(xiàn)的。

閉包函數(shù)也可以作為變量的值來使用。

PHP 會自動把此種表達式轉換成內(nèi)置類 Closure 的對象實例。把一個 closure 對象賦值給一個變量的方式與普通變量賦值的語法是一樣的,最后也要加上分號。

$greet = function($name)
{
    printf("Hello %s 
", $name);
};

$greet("World"); // Hello World
$greet("PHP"); // Hello PHP
閉包可以從父作用域中繼承變量。

任何此類變量都應該用 use 語言結構傳遞進去。
PHP 7.1 起,不能傳入此類變量: superglobals、 $this 或者和參數(shù)重名。

$message = "hello";

// 沒有 "use"
$example = function () {
    var_dump($message);
};
echo $example(); // PHP Notice:  Undefined variable: message

// 繼承 $message
$example = function () use ($message) {
    var_dump($message);
};
echo $example(); // string(5) "hello"

// 繼承的變量的值來自于函數(shù)定義時,而不是調(diào)用時
$message = "world";
echo $example(); // string(5) "hello"
通過引用繼承父作用域中的變量,可以將父作用域更改的值反映在函數(shù)調(diào)用中
$message = "hello";

// 通過引用繼承
$example = function () use (&$message) {
    var_dump($message);
};
echo $example(); // string(5) "hello"

// 父作用域更改的值反映在函數(shù)調(diào)用中
$message = "world";
echo $example(); // string(5) "world"
閉包函數(shù)也可以接受常規(guī)參數(shù)
$message = "world";

$example = function ($arg) use ($message) {
    var_dump($arg . " " . $message);
};
$example("hello"); // string(11) "hello world"
六、實例分析 例1
//聲明函數(shù)swap,作為下面匿名函數(shù)的回調(diào)函數(shù)
function swap(&$x, &$y)
{
    $temp = $x;
    $x = $y;
    $y = $temp;

    return;
}

//call_user_func調(diào)用的回調(diào)函數(shù)
function add($a, $b)
{
    return $a + $b;
}

//匿名函數(shù),即不聲明函數(shù)名稱而使用一個變量來代替函數(shù)聲明
$fuc = function ($fucName) {
    $x = 1;
    $y = 2;
    //調(diào)用回調(diào)函數(shù)
    $fucName($x, $y);
    echo "x=" . $x . ",y=" . $y, "
";

    //與$fucName($x, $y)相同效果
    //這里無法調(diào)用swap方法,因為swap方法是對參數(shù)引用傳值
    //call_user_func與call_user_func_array都無法調(diào)用引用傳參形式的函數(shù)
    echo call_user_func("add", $x ,$y);
};

//調(diào)用 $fuc
$fuc("swap");

輸出:

x=2,y=1
3
例2
$var1 = 5;
$var2 = 10;

function foo(&$my_var)
{
    global $var1;
    $var1 += 2;
    $var2 = 4;
    $my_var += 3;
    return $var2;
}

$my_var = 5;
echo foo($my_var). "
";
echo $my_var. "
";
echo $var1;
echo $var2;
$bar = "foo";
$my_var = 10;
echo $bar($my_var). "
";

第14行調(diào)用 foo() 方法

function foo(&$my_var)
{
    global $var1; // 5
    $var1 += 2; // 7
    $var2 = 4; // 4
    $my_var += 3; // 8
    return $var2; // 4
}

$my_var = 5;
echo foo($my_var). "
"; // 4

第14行到第17行輸出的值分別為:

echo foo($my_var). "
"; // 4
echo $my_var. "
"; // 8
echo $var1; // 7
echo $var2; // 10

第20行再次調(diào)用foo() 方法

function foo(&$my_var)
{
    global $var1; // 7
    $var1 += 2; // 9
    $var2 = 4; // 4
    $my_var += 3; // 13
    return $var2; // 4
}

$bar = "foo";
$my_var = 10;
echo $bar($my_var). "
"; // foo($my_var)  => 4

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/30883.html

相關文章

  • 搞定PHP面試 - 正則表達式識點整理

    摘要:是決定正則表達式匹配規(guī)則的主要部分。二分隔符分隔符的選擇當使用函數(shù)的時候,正則表達式必須由分隔符閉合包裹。果分隔符經(jīng)常在正則表達式內(nèi)出現(xiàn),最好使用其他分隔符來提高可讀性。需要將一個字符串放入正則表達式中使用時,可以用函數(shù)對其進行轉義。 一、簡介 1. 什么是正則表達式 正則表達式(Regular Expression)就是用某種模式去匹配一類字符串的一種公式。正則表達式使用單個字符串來...

    AaronYuan 評論0 收藏0
  • 搞定PHP面試 - 變量識點整理

    摘要:聲明靜態(tài)變量時不能用表達式的結果對其賦值正確錯誤使用表達式的結果賦值錯誤使用表達式的結果賦值靜態(tài)變量與遞歸函數(shù)靜態(tài)變量提供了一種處理遞歸函數(shù)的方法。 一、變量的定義 1. 變量的命名規(guī)則 變量名可以包含字母、數(shù)字、下劃線,不能以數(shù)字開頭。 $Var_1 = foo; // 合法 $var1 = foo; // 合法 $_var1 = foo; // 合法 $Var-1 = foo; /...

    Mertens 評論0 收藏0
  • 搞定PHP面試 - PHP魔術方法識點整理

    摘要:魔術方法知識點整理代碼使用語法編寫一構造函數(shù)和析構函數(shù)構造函數(shù)具有構造函數(shù)的類會在每次創(chuàng)建新對象時先調(diào)用此方法,所以非常適合在使用對象之前做一些初始化工作。在析構函數(shù)中調(diào)用將會中止其余關閉操作的運行。析構函數(shù)中拋異常會導致致命錯誤。 PHP魔術方法知識點整理 代碼使用PHP7.2語法編寫 一、構造函數(shù)和析構函數(shù) __construct() 構造函數(shù) __construct ([ mi...

    付永剛 評論0 收藏0
  • 搞定PHP面試 - MySQL基礎識點整理 - 存儲引擎

    摘要:支持崩潰后的安全恢復。的使用場景更新密集的表存儲引擎特別適合處理多重并發(fā)的更新請求。外鍵約束支持外鍵的存儲引擎只有。引擎是及之前版本的默認存儲引擎。文件存儲表的索引。引擎存儲引擎是引擎的變種。 MySQL基礎知識點整理 - 存儲引擎 0. 查看 MySQL 支持的存儲引擎 可以在 mysql 客戶端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

    whatsns 評論0 收藏0

發(fā)表評論

0條評論

SimpleTriangle

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<