PHP实践之路(七)PHP函数

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

?>


你可能感兴趣的:(PHP,函数,实践,可变函数)