PHP教程第十讲.docx
《PHP教程第十讲.docx》由会员分享,可在线阅读,更多相关《PHP教程第十讲.docx(7页珍藏版)》请在冰豆网上搜索。
![PHP教程第十讲.docx](https://file1.bdocx.com/fileroot1/2022-11/24/d2c5c117-f75d-4e5e-a47e-76501613cb38/d2c5c117-f75d-4e5e-a47e-76501613cb381.gif)
PHP教程第十讲
一、用户自定义函数
一个函数可由以下的语法来定义:
Example1展示函数用途的伪代码:
php
functionfoo($arg_1,$arg_2,...,$arg_n)
{
echo"Examplefunction.\n";
return$retval;
}
?
>
任何有效的PHP代码都有可能出现在函数内部,甚至包括其它函数和类定义。
函数名和PHP中的其它标识符命名规则相同。
有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。
除非是下面两个例子中的情况,函数必须在其调用之前定义。
Example2条件函数:
php
$makefoo=true;
/*我们不能在处调用foo()函数,
因为它还不存在,但可以调用bar()函数。
*/
bar();
if($makefoo){
functionfoo()
{
echo"Idon'texistuntilprogramexecutionreachesme.\n";
}
}
/*现在我们可以安全调用函数foo()了,
因为$makefoo值为真*/
if($makefoo)foo();
functionbar()
{
echo"Iexistimmediatelyuponprogramstart.\n";
}
?
>
Example3函数中的函数:
php
functionfoo()
{
functionbar()
{
echo"Idon'texistuntilfoo()iscalled.\n";
}
}
/*现在还不能调用bar()函数,因为它还不存在*/
foo();
/*现在可以调用bar()函数了,因为foo()函数
的执行使得bar()函数变为已定义的函数*/
bar();
?
>
PHP中的所有函数和类都具有全局作用域,可以在内部定义外部调用,反之亦然。
PHP不支持函数重载,也不可能取消定义或者重定义已声明的函数。
Note:
函数名是大小写无关的,不过在调用函数的时候,通常使用其在定义时相同的形式。
Example4递归函数:
php
functionrecursion($a)
{
if($a<20){
echo"$a\n";
recursion($a+1);
}
}
?
>
二、函数的参数
通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表。
PHP支持按值传递参数(默认),通过引用传递参数以及默认参数。
也支持可变数量的参数;Example1向函数传递数组:
php
functiontakes_array($input)
{
echo"$input[0]+$input[1]=",$input[0]+$input[1];
}
?
>
1.通过引用传递参数
缺省情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。
如果希望允许函数修改它的参数值,必须通过引用传递参数。
如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面预先加上符号&:
Example2用引用传递函数参数:
php
functionadd_some_extra(&$string)
{
$string.='andsomethingextra.';
}
$str='Thisisastring,';
add_some_extra($str);
echo$str;//outputs'Thisisastring,andsomethingextra.'
?
>
2.默认参数的值
函数可以定义C++风格的标量参数默认值,如下:
Example3在函数中使用默认参数:
php
functionmakecoffee($type="cappuccino")
{
return"Makingacupof$type.\n";
}
echomakecoffee();
echomakecoffee(null);
echomakecoffee("espresso");
?
>
以上例程会输出:
Makingacupofcappuccino.
Makingacupof.
Makingacupofespresso.
三、返回值
值通过使用可选的返回语句返回。
可以返回包括数组和对象的任意类型。
返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行。
Example1return的使用:
php
functionsquare($num)
{
return$num*$num;
}
echosquare(4);//outputs'16'.
?
>
函数不能返回多个值,但可以通过返回一个数组来得到类似的效果。
Example2返回一个数组以得到多个返回值:
php
functionsmall_numbers()
{
returnarray(0,1,2);
}
list($zero,$one,$two)=small_numbers();
?
>
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用操作符&:
Example3从函数返回一个引用
php
function&returns_reference()
{
return$someref;
}
$newref=&returns_reference();
?
>
四、可变函数
PHP支持可变函数的概念。
这意味着如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并且尝试执行它。
可变函数可以用来实现包括回调函数,函数表在内的一些用途。
变量函数不能用于语言结构,例如echo,print,unset(),isset(),empty(),include,require以及类似的语句。
需要使用自己的包装函数来将这些结构用作变量函数。
Example1可变函数示例:
php
functionfoo(){
echo"Infoo()
\n";
}
functionbar($arg=''){
echo"Inbar();argumentwas'$arg'.
\n";
}
//使用echo的包装函数
functionechoit($string)
{
echo$string;
}
$func='foo';
$func();//Thiscallsfoo()
$func='bar';
$func('test');//Thiscallsbar()
$func='echoit';
$func('test');//Thiscallsechoit()
?
>
还可以利用可变函数的特性来调用一个对象的方法。
Example2可变方法范例:
php
classFoo
{
functionVariable()
{
$name='Bar';
$this->$name();//ThiscallstheBar()method
}
functionBar()
{
echo"ThisisBar";
}
}
$foo=newFoo();
$funcname="Variable";
$foo->$funcname();//Thiscalls$foo->Variable()
?
>
五、匿名函数
Example1Anonymousfunction示例
php
echopreg_replace_callback('~-([a-z])~',function($match){
returnstrtoupper($match[1]);
},'hello-world');
//输出helloWorld
?
>
闭包函数也可以作为变量的值来使用。
PHP会自动把表达式转换成内置类Closure的对象实例。
把一个closure对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号。
Example2匿名函数变量赋值示例:
php
$greet=function($name)
{
printf("Hello%s\r\n",$name);
};
$greet('World');
$greet('PHP');
?
>
六、小结
本节讲了PHP的函数,可以使用function关键字定义,PHP中还支持可变函数、引用函数和匿名函数。
七、练习
掌握返回引用的函数和返回值的函数的区别。