PHP實踐之路(七)PHP函式

cyxlzzs發表於2013-07-01

PHP實踐之路(目錄索引)

PHP函式

1、函式名

a、函式名以字母或下劃線打頭,後面跟字母,數字或下劃線(大小寫無關)

b、所有函式和類都具有全域性作用域,可以在內部定義外部呼叫,反之亦然。

c、不支援函式過載,也不可能取消定義或者重定義已宣告的函式

d、函式的呼叫必須是先定義後使用

e、任何有效的 PHP 程式碼都有可能出現在函式內部,甚至包括其它函式和類定義

接下來實驗一下

<?php
	function foo(){
		echo "Hello World<br />";
	}
	
	foo();	//函式的呼叫,輸出Hello World
	
	/*
	此處函式重複定義,因為函式名大小寫無關,所以函式foo和函式FOO被認為是同一個函式,編譯
	報錯:Fatal error: Cannot redeclare FOO() 
	function FOO(){
		echo "do something";
	}
	*/
	
	function outer(){
		echo "outer function executed..<br />";
		
		//函式內部定義函式
		function inner(){
			echo "inner function executed..<br />";
		}
	}
	
	//如果根據函式呼叫必須是先定義的規則,如果我們直接呼叫inner()函式將出錯
	//inner();		//此處出錯:Fatal error: Call to undefined function inner()
	
	//如果我們先呼叫outer()函式,然後再呼叫innner()函式就好了,呼叫outer()後,inner()函式將被認為是已定義
	outer();	//輸出 outer function executed..
	inner();	//函式具有全域性作用域,內部定義外部也可以使用。輸出 inner function executed..
?>


2、函式引數

a、函式引數的傳遞有三種方式:按值傳遞、引用傳遞和預設引數三種

b、任何預設引數必須放在任何非預設引數的右側

c、可變引數列表,支援不固定引數個數及型別的引數傳遞方式。可變引數列表方式必須使用func_num_args()func_get_arg() 以及func_get_args()三個函式

針對以上知識點,我們動動手吧

<?php
	//按值傳遞引數
	function sayHello($name){
		$name="[".$name."]";	//修改$name的值
		echo "Hello ".$name."<br />";
	}
	$name = "jack";
	
	sayHello($name);	//輸出Hello [jack]
	
	echo $name;			//$name沒有發生變化,輸出jack
	echo "<br />";		//換行
	
	//引用傳遞
	function sayHello2(&$name){
		$name="[".$name."]";	//修改$name的值
		echo "Hello ".$name."<br />";
	}
	
	sayHello2($name);	//輸出Hello [jack]
	
	echo $name;			//$name已經發生了變化,輸出[jack]
	echo "<br />";		//換行
	//預設引數
	function sayHello3($name = "somebody"){
		$name="[".$name."]";	//修改$name的值
		echo "Hello ".$name."<br />";
	}
	
	sayHello3();		//採用預設引數值,輸出Hello [somebody]
	sayHello3("lucy");	//採用傳遞的引數值,輸出Hello [lucy]
	
	//任何預設引數必須放在任何非預設引數的右側
	/*
	以下函式的定義將導致呼叫sayMore("How do you do");出錯,它預設將傳入的引數
	賦值給了$name,而$more的值確遺失了
	function sayMore($name = "somebody",$more){
		$name="[".$name."]";
		echo "Hello ".$name." ".$more."<br />";
	}
	*/
	function sayMore($more,$name = "somebody"){
		$name="[".$name."]";
		echo "Hello ".$name." ".$more."<br />";
	}
	sayMore("How do you do");		//輸出Hello [somebody] How do you do
	
	
	//以下測試可變參列表的使用
	function showFamilyMembers(){
		$num = func_num_args();		//通過func_num_args()函式獲取引數的數量
		for($i=0;$i<$num;$i++){
			echo func_get_arg($i);		//通過func_get_arg()函式獲取具體某個引數的值
			echo " ";
		}
		echo "<br />";		//換行
	}
	showFamilyMembers("jack","lucy");		//輸出:jack lucy
	showFamilyMembers("jack","lucy","lily");		//輸出:jack lucy lily 
	
	//第二種方式獲取引數列表
	function showFamilyMembers2(){
		$members=func_get_args();		//通過func_get_args()函式獲取引數列表
		foreach($members as $member){
			echo $member;
			echo " ";
		}
		echo "<br />";		//換行
	}
	showFamilyMembers2("jack","lucy");		//輸出:jack lucy
	showFamilyMembers2("jack","lucy","lily");		//輸出:jack lucy lily 
?>


3、函式返回值

a、函式只能返回一個值,如果需要返回多個值時可以採用返回陣列的方式
b、從函式返回一個引用,必須在函式宣告和指派返回值給一個變數時都使用引用操作符 &
函式的返回值這塊相對比較簡單,需要了解的內容也比較少,接下來簡單測試一下
<?php
function getOneColor(){
	return "red";	//返回一個值
}

function getMoreValue(){
	$arr=array("red","blue","orange");	//返回多個值
	return $arr;
}

echo(getOneColor());	//輸出val1
echo "<br />";

var_dump(getMoreValue());
/*輸出
array (size=3)
  0 => string 'red' (length=3)
  1 => string 'blue' (length=4)
  2 => string 'orange' (length=6)
*/
echo "<br />";

/********以下測試返回引用***********/
class test {
    public $value = 42;

    public function &getValue() {
        return $this->value;
    }
}

$obj = new test;
$myValue = &$obj->getValue(); 
echo $myValue;                // 輸出42
echo "<br />";
$obj->value = 2;
echo $myValue;                // 輸出2
?>


4、可變函式

a、變數後面跟上圓括號,PHP 將尋找與變數的值同名的函式,並且嘗試執行它
b、可變函式一般用來實現函式的回撥
實驗時間
<?php
function sayHello($name = "somebody"){
	echo "Hello ".$name;
}

$func="sayHello";

$func();		//輸出Hello somebody
echo "<br />";	//換行
$func("jack");	//輸出Hello jack

?>


版權宣告:本文為博主原創文章,未經博主允許不得轉載。

相關文章