一步一步學(xué)習(xí)PHP(4) php 函數(shù) 補(bǔ)充2
1. 解決作用域問題
在上一節(jié)談到了PHP中函數(shù)的作用域問題,如果說類還不夠說明問題,那么在這篇文章中的作用域例子,也許對(duì)您更有說服力。
那么,我們?nèi)绾文茉赑HP的函數(shù)中訪問外部的變量呢?
在PHP中,存在一個(gè)概念叫做全局作用域,也就是說,如果你不使用函數(shù)(未來會(huì)有類的概念),那么你創(chuàng)建的變量可以在頁面的任何地方訪問。那么,我們怎么解決函數(shù)體內(nèi)的問題呢?
我們可以使用global關(guān)鍵字:
<?php $name="kym"; function Test() { global $name; echo($name); } Test(); ?>
這樣的話,我們就相當(dāng)于得到了對(duì)全局變量$name的一個(gè)引用,而不需要重新創(chuàng)建一個(gè)$name變量了。
在PHP手冊中有這樣一句話:使用全局變量等效于在$GLOBALS變量中創(chuàng)建一個(gè)對(duì)變量的引用。那么我們就可以模仿這個(gè)語義寫出這樣的代碼:
<?php $name="kym"; function Test() { $temp=&$GLOBALS["name"]; echo($temp); } Test(); ?>
其實(shí)這兩種是等效的代碼??瓷先ミ@樣使用變量很麻煩,但是這樣其實(shí)避免了很多副作用的產(chǎn)生,如Java,C#是面向?qū)ο蟮恼Z言,但是在PHP中,一切都在一個(gè)頁面,甚至多個(gè)頁面中,那么如果不使用這樣的辦法,很容易產(chǎn)生函數(shù)的副作用(誤修改)。
2. 默認(rèn)參數(shù)
第一次聽過這個(gè)概念應(yīng)該是在C++中,之后學(xué)了C#,就沒有接觸過這個(gè)概念了,不過個(gè)人還是非常喜歡這個(gè)特性的。
這樣就可以不必要為一個(gè)函數(shù)寫一堆麻煩的重載函數(shù)了。
寫個(gè)最簡單的例子:
<?php function Test($name="kym") { echo($name); } Test(); Test("others"); ?>
是不是不需要寫一個(gè)重載函數(shù)了呢?
但是在這里需要注意兩點(diǎn):
A. 在為參數(shù)設(shè)置默認(rèn)值時(shí),只能設(shè)置最簡單的常量,而不能包含復(fù)雜的表達(dá)式。
B. 需要設(shè)置默認(rèn)值的參數(shù)必須放在最后。這個(gè)類似于C#中的可變參數(shù)。
3. 可變參數(shù)
在C#中,就存在這樣一個(gè)概念叫可變參數(shù),寫個(gè)簡單的例子:
protected void LinkButton1_Click(object sender, EventArgs e) { Response.Write(GetSum(1, 2, 3, 4, 5)); } public int GetSum(params int[] elements) { int sum = 0; for (int i = 0; i < elements.Length; i++) { sum += elements[i]; } return sum; }
在寫例子之前,我先來介紹三個(gè)與可變參數(shù)相關(guān)的函數(shù)。
func_get_args()返回函數(shù)的所有參數(shù)的數(shù)組
func_get_arg()返回一個(gè)來自參數(shù)的特定參數(shù)
func_num_args()返回參數(shù)的個(gè)數(shù)。
好,那么接下來就寫一個(gè)和C#版本對(duì)應(yīng)的PHP版本。
<?php function GetSum() { if(func_num_args()==0) { return 0; } $sum=0; for($i=0;$i<func_num_args();$i++) { $sum+=func_get_arg($i); } return $sum; } echo(GetSum(1,2,3,4)); ?>
4. 可變函數(shù)
我不知道為什么要翻譯成這個(gè)名字,其實(shí)就是根據(jù)變量的名字來調(diào)用相應(yīng)的函數(shù)。
很類似于JS中的這個(gè)eval,如下所示:
<script> function Execute(functionName) { eval(functionName+"()"); } function Test() { alert("111"); } Execute("Test"); </script>
這個(gè)就是傳進(jìn)來一個(gè)函數(shù)名,然后來執(zhí)行對(duì)應(yīng)的函數(shù)。那么在PHP中,其實(shí)也是一樣的,而且更簡單了。
<?php function Test($func) { $func(); } function First(){echo("first");} Test("First"); ?>
相關(guān)文章
PHP數(shù)組中頭部和尾部添加元素的方法(array_unshift,array_push)
對(duì)于數(shù)字索引數(shù)組來說,通過 array_push()函數(shù)向數(shù)組中尾部添加元素,array_unshift頭部添加元素,需要的朋友可以參考下2017-04-04PHP4 與 MySQL 數(shù)據(jù)庫操作函數(shù)詳解
PHP4 與 MySQL 數(shù)據(jù)庫操作函數(shù)詳解...2006-10-10一個(gè)可以刪除字符串中HTML標(biāo)記的PHP函數(shù)
一個(gè)可以刪除字符串中HTML標(biāo)記的PHP函數(shù)...2006-10-10一個(gè)簡單的自動(dòng)發(fā)送郵件系統(tǒng)(二)
一個(gè)簡單的自動(dòng)發(fā)送郵件系統(tǒng)(二)...2006-10-10