PHP实践之路(目录索引)
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.. ?>
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 ?>
<?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 ?>
<?php function sayHello($name = "somebody"){ echo "Hello ".$name; } $func="sayHello"; $func(); //输出Hello somebody echo "<br />"; //换行 $func("jack"); //输出Hello jack ?>