Heim  >  Artikel  >  php教程  >  php核心技术-函数的使用(二)

php核心技术-函数的使用(二)

WBOY
WBOYOriginal
2016-06-21 08:50:131236Durchsuche

 

+----phpstar-------------------------------------+

+---为大家提供最全 最好的php学习笔记 --+

+---- 看笔记就可以学好php--------------------+

+-----------------------------------------------------+

 

可变函数

类似可变变量,在函数上  函数的名称也是可变的。意味着 一个函数的函数名也是可以用一个变量代替的。

 

利用可变变量 完成计算器

 

匿名函数:

匿名函数,指的是没有函数名称的函数。因此这个函数就没有办法像一个正常函数一样被调用。通常 都是作为某个函数的参数来使用,这让自动地调用。Callback 数据伪类型。

例如:map数组的操作:

 

 

我们没有办法直接调用这个匿名函数,因此总是会作为某个函数的参数来使用。

匿名函数的作用:

普通函数可以先使用,后定义。因为函数的声明不是在脚本的执行期间确定的,而是在脚本的编译期间确定的。而 编译 在 执行之前。

 

于此相对,匿名函数是在执行时才确定的。

而且 普通函数 一旦声明 在脚本结束之前都可以调用。

于此相对,匿名函数在执行完毕后,函数空间立即释放。匿名函数只能去执行一次。

如果一个函数只用一次的话,匿名函数会比较节省资源。

但是匿名函数是php的性特征。

Php5.3才会有的匿名函数。

 

如果没有匿名函数,那么哪些需要以callback形式做参数的调用应该如何处理?callback参数应该使用函数名代替,同时需要有相对应的函数存在。

 

Tip:php的匿名函数 也叫 闭包函数。

 

函数的递归调用:

函数可以在任何地方调用,甚至包括在函数的函数体内,对当前函数进行调用。

如果是函数对自己进行调用,称之为函数的递归调用。

最极端的例子:

 

 

函数的递归调用,可以解决 显示生活中一些 可以按照递归思想去思考的问题。

求阶乘

5! = 5 * 4 * 3 * 2 * 1;

4! = 4 * 3 * 2 * 1

3! = 3 * 2 * 1;

1! = 1;

5! = 5 * 4!;

4! = 4 * 3!;

 

假设我们现在定义了一个函数可以求n的阶乘。

 Jiecheng(n); 返回n的阶乘 n * jiecheng(n-1)

 Jiecheng(5) = 5 * jiecheng(4); 

 

如果需要使用递归的思想完成编程设计的话,大家需要考虑2个主要问题?

1 递归点?这个问题为什么可以使用递归完成。

2 递归出口?如果函数内不加限制的调用自己的话,一定会无限制的执行下去(死)。一定要找到,当达到什么条件后,递归调用就可以终止了。 这个条件就是递归点。

 

例如阶乘:

递归点:jiecheng(n) = n * jiecheng(n-1)。 求n的阶乘 与 n-1的阶乘的解决方法是一样的,因此可以用一个函数完成。

出口:当需要求得1的阶乘时,不用再继续调用自己求得,因为1的阶乘是可以知道的。

每当调用一个函数 会在 函数的栈区 形成一个函数的执行空间:

栈:内存的一个存储区域。他的操作特点:后进先出(先进后出)

注意:递归调用的函数,每一个都会开辟一个内存空间,意味着 么一个调用都有一个单独的作用域,因此 局部变量是不会共享的。 通常使用 static 静态局部变量解决问题。

 

斐波那契数列:

前两项已知(通常是1, 1),从第三项开始,每一项都是前两项之和:

1 1 2 3 5 8 13 

编写一个函数,求出斐波那契数列地n项的值

Fbnq(4) == 3

Fbnq(7) == 13

Fbnq(n) = fbnq(n-1) + fbnq(n-2);

递归点:

递归出口:前两项已知

 

函数的一些相关信息的  系统函数。

Function_exists(‘函数名’); 判断一个函数是否被定义,是否已经存在。返回值为布尔类型 

 

 

Func_get_args(); 获得当前函数的所有参数的值。应该在函数内调用,获得的是函数调用时传递进来的参数,而不是函数定义时的形参。

注意:

函数在调用时,实际参数的个数应该大于等于形式参数的个数。只能多 不能少!

当 实际参数的个数 多余 形式参数的个数时 我们怎么在函数中获得实际参数的值?可以使用函数内的 func_get_args()函数获得所有的实际参数。实际参数按照传递的位置,依次保存在func_get_args()的返回结果中。

 

例如:

制作一个函数,求得所有参数的和。要求是参数个数不固定。

sumAll();   0

sumAll(10);   10

sumAll(10, 20);   30

sumAll(10, 20, 30)   60

 

程序如下:

Func_get_arg(int index) 获得某个参数的函数。参数int 表示的第几个。索引位置从0开始。

 

Func_num_args 获得所以的实际参数的个数。

 

函数中 可以使用 魔术常量 __FUNCTION__来代替当前的函数名。

常见的用法,在递归中 使用这个值:可以保证在函数名发生变化时,不需要修改函数体,就可以完成操作。

 



Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn