進階 WWW 程式設計 -- PHP 語言結構(三) 靜宜大學資訊管理學系 蔡奇偉副教授 2003 2019/1/1 進階 WWW 程式設計 PHP 語言結構(三) 靜宜大學資訊管理學系 蔡奇偉副教授 2003 靜宜大學資管系 蔡奇偉編撰 版權所有 2003
內容大綱 函式的定義 函式的呼叫 函式的參數 變數的有效範圍 傳回函式值 變函式 無名函式
函式的定義 function function_name (parameter1, parameter2, … parametern) { statement list } 函式名稱的命名 function_name 必須符合識別字的規則。 函式名稱的大小寫無區別,如 sin, Sin, 和 SIN 都代表同一個函式。 參數列 parameter1, parameter2, … parametern 可以是 0 個、1 個、或 1 個以上的參數。 敘述列可以是 PHP 的敘述或 HTML 的敘述。
每呼叫 col() 一次就會在網頁中加入 </td><td> 這兩個 HTML 標籤 範例 function strcat ($left, $right) { $combined_string = $left . $right; return $combined_string; } function strcat ($left, $right) { return $left . $right; } 每呼叫 col() 一次就會在網頁中加入 </td><td> 這兩個 HTML 標籤 <?php function col () { ?> </td><td> <?php } ?>
在 PHP4 中,函式不需要在呼叫之前定義,除非函式的定義出現在條件敘述中,譬如: <?php $makefoo = true; /* We can't call foo() from here since it doesn't exist yet, but we can call bar() */ bar(); if ($makefoo) { function foo () { echo "I don't exist until program execution reaches me.\n"; } }
/. Now we can safely call foo() since $makefoo evaluated to true /* Now we can safely call foo() since $makefoo evaluated to true */ if ($makefoo) foo(); function bar() { { echo "I exist immediately upon program start.\n"; } ?>
在 PHP4 中,函式 A 可以寫在函式 B 中,但只有在函式 B 被呼叫後,函式 A 才真正被定義而能被呼叫。 function foo() { function bar() { echo "I don't exist until foo() is called.\n"; } } /* We can't call bar() yet since it doesn't exist. */ foo(); /* Now we can call bar(), foo()'s processing has made it accessible. */ bar();
函式的呼叫 function_name (argument_list); $result = function_name (argument_list); 第一式用在呼叫無傳回值的函式,或不需處理函式的傳回值時。 第二式用來呼叫有傳回值的函式,並把傳回值儲存在變數 $result 中。 函式名稱 function_name 可以是內建函式或使用者自定的函式。 引數列 argument_list 包含欲傳入的引數。你得先閱讀函式的說明 文件,了解其各個參數的目的與接受的參數個數,才能正確地使 用該函式。
範例 function strcat ($left, $right) { return $left . $right; } // 呼叫 strcat 函式並依序代入 ’Hello, ’ 和 ’woild!’ 兩個引數。 $msg = strcat (’Hello, ’, ’woild!’); // $msg 得值 ’Hello, world!’
函式的參數 Pass-by-value References Pass-by-reference 預設的參數值 處理數目不定的參數
Pass-by-value(數值傳遞) 範例 把引數的值傳遞給函式的參數。 function max ($x, $y) $a = 3; { return ($x >= $y) ? $x : $y; } $a = 3; $b = 4; $m = max($a, $b); $a $b $x $y max 傳遞 3 4
範例 function swap ($x, $y) { $temp = $x; $x = $y; $y = $temp; } $a = 3; $b = 4; swap($a, $b); $a $b $x $y swap 傳遞 3 4 使用數值傳遞的方式時,引數與參數是不同的變數。所以 swap 只交換了參數 $x 和 $y 的值,並沒有交換引數 a 和 b 的值。
References(參照) 在 PHP 中,變數的名稱和它的內容是分開的兩件事。舉例來說,指定 3 給變數 $foo 後,它的名稱和內容如下圖所示: name content $foo 3 對同一個內容,我們可以用參照來建立不同的名稱來存取它,譬如: $bar = & $foo; $foo 3 $bar 這一行敘述使得變數 $bar 是變數 $foo 的一個參照,亦即使得兩個變數指涉相同的內容,如右圖所示。
Pass-by-reference(參照傳遞) 只要在函式定義中的參數前加上 & 就會使得該參數是引數的一個參照。存取參照型態的參數時,等同於直接存取其對應的引數。因此參照傳遞的方式可以讓我們在函式中修改引數的值。 範例 function inc (& $x) { { $x++; } $a = 10; inc($a); echo $a; // 11 function inc ($x) { { $x++; } $a = 10; inc($a); echo $a; // 10
範例 function swap (&$x, &$y) { $temp = $x; $x = $y; $y = $temp; } $b = 4; swap($a, $b); swap $a $x $b $y 在 swap 中交換 x 和 y 的值,等同於交換引數 a 和 b 的值。
預設的參數值 你可以在函式定義中指定參數的預設值,譬如: function makecoffee ($type = "cappuccino“) { return "Making a cup of $type.\n"; } echo makecoffee (); // Making a cup of cappuccino echo makecoffee ("espresso"); // Making a cup of espresso 預設值必須是常數算式,不能是變數或函式呼叫。 指定預設值的參數必須擺在未指定者之後。
處理數目不定的參數 範例 若參數數目不固定,你可以在函式中呼叫底下的三個函式來處理: func_num_args ( ) : 傳回函式所接收到的引數個數。 func_get_arg ( $n ) : 傳回第 $n 個引數。 func_get_args ( ) :傳回一陣列,其中包含所有的引數。 範例 function foo() { $numargs = func_num_args(); echo "Number of arguments: $numargs<br>\n"; if ($numargs >= 2) { echo "Second argument is: " . func_get_arg (1) . "<br>\n"; } $arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) { echo "Argument $i is: " . $arg_list[$i] . "<br>\n"; } } foo (1, 2, 3);
變數的有效範圍 範例 PHP 的變數根據它們第一次出現的所在可以區分為以下兩種: 全域變數:出現在函式定義以外的變數。 局部變數:出現在函式定義中的參數與變數。 基本上,全域變數若未經過宣告,不能在函式中直接存取;局部變數則完全不能在函式以外的地方存取。 範例 $a = 3; // $a is a global variable. function foo () { $a += 100; // $a is a local variable. } foo(); echo $a; // print global $a, i.e., 3.
範例 如果要在函式存取全域變數,你必須在函式中將其宣告成 global,如下例所示: $a = 1; $b = 2; function Sum() { global $a, $b; $b = $a + $b; } Sum(); echo $b; // 3 $a = 1; $b = 2; function Sum() { // global $a, $b; $b = $a + $b; } Sum(); echo $b; // 2
超級全域變數(superglobal) 為了程式撰寫方便,你可以在函式中不經 global 宣告而直接存取 PHP 內建的某一些全域變數。這些變數稱之為超級全域變數。以下是這些變數的表列,我們以後會介紹它們的用途。 $GLOBALS Contains a reference to every variable which is currently available within the global scope of the script. The keys of this array are the names of the global variables. $_SERVER Variables set by the web server or otherwise directly related to the execution environment of the current script. $_GET Variables provided to the script via HTTP GET.
$_POST Variables provided to the script via HTTP POST. $_COOKIE Variables provided to the script via HTTP cookies. $_FILES Variables provided to the script via HTTP post file uploads. $_ENV Variables provided to the script via the environment. $_REQUEST Variables provided to the script via any user input mechanism, and which therefore cannot be trusted.. $_SESSION Variables which are currently registered to a script's session.
範例 function test_global() { // Most predefined variables aren't "super" and require // 'global' to be available to the functions local scope. global $HTTP_POST_VARS; echo $HTTP_POST_VARS['name']; // Superglobals are available in any scope and do // not require 'global'. Superglobals are available // as of PHP 4.1.0 echo $_POST['name']; }
靜態變數(static variable) 你可以把一個局部變數宣告成靜態變數,使得函式執行完成後仍能保持其值而不被消除。 範例 function counter () { static $count = 0; return $count++; } for ($i = 1; $i <= 5; $i++) { echo counter(); } function counter () { $count = 0; return $count++; } for ($i = 1; $i <= 5; $i++) { echo counter(); } 輸出:0 1 2 3 4 輸出:0 0 0 0 0
傳回函式值 在函式中,return 敘述可以用來傳回函式值;不過你只能傳回一個值,譬如: function return_one () { } 如果想傳回多個值,你可以把它們包裝在一個陣列中,然後再傳回該陣列,譬如: function return_two () { return array(“Fred”, 35); }
變函式(Variable Functions) 如果一個變數後面直接跟著括號 (),則 PHP 會把變數的值視為某個函式的名稱,然後嘗試去呼叫它。這個變數稱式為變函式。 範例 變函式不能用來存 PHP 的基本函式:echo(), print(), unset(), isset(), empty(), include(), require() 等等。 function foo() { echo "In foo()<br>\n"; } function bar($arg = ' ') { echo "In bar(); argument was '$arg'.<br>\n"; } $func = 'foo'; $func(); // This calls foo() $func = 'bar'; $func('test'); // This calls bar()
無名函式(Anonymous Functions) 你可以用底下的 PHP 內建函式來產生一個無名函式: create_function ($args, $code ) 範例 $newfunc = create_function ( '$a, $b', 'return "ln($a) + ln($b) = ".log($a * $b);‘ ); echo "New anonymous function: $newfunc\n"; echo $newfunc(2,M_E)."\n"; // outputs // New anonymous function: lambda_1 // ln(2) + ln(2.718281828459) = 1.6931471805599