PHP 自定义函数和系统函数

PHP 自定义函数和系统函数php 函数函数的参数通过参数列表可以传递信息到函数 即以逗号作为分隔符的表达式列表 PHP 支持按值传递参数 默认 通过引用传递以及默认参数

大家好,欢迎来到IT知识分享网。

php函数

函数的参数

通过参数列表可以传递信息到函数, 即以逗号作为分隔符的表达式列表。

PHP 支持按值传递参数(默认), 通过引用传递以及默认参数。

按值传递参数:

function takes_array($input) { echo "$input[0] + $input[1] = ". $input[0]+$input[1]; }

通过引用传递参数

通过引用传递参数允许函数修改它的参数值。

function add_some_extra(&$string) { $string .= 'and something extra.'; } $str = 'This is a string, '; add_some_extra($str); echo $str; // 输出 'This is a string, and something extra.'

注意:引用传递参数只能传递变量;不能直接传值

默认参数的值

在函数有多个参数的情况下, 任何默认参数必须放在任何非默认参数的右侧;

参数是否带引号,要看参数的变量类型; 字符串的需要带上引号

PHP 还允许使用数组和特殊类型 NULL 作为默认参数

function makecoffee($types = array("cappuccino"), $coffeeMaker = NULL) { $device = is_null($coffeeMaker) ? "hands" : $coffeeMaker; return "Making a cup of ".join(", ", $types)." with $device.\n"; } echo makecoffee(); echo makecoffee(array("cappuccino", "lavazza"), "teapot");

返回值 return

在一个函数中调用 return() 语句, 将立即结束此函数的执行并将它的参数作为函数的值返回。

return;

表示没有返回值,直接退出函数

变量的作用域

php中变量作用域分3种:

全局作用域:就是在函数的外部范围

局部作用域:就是在函数的内部范围

超全局作用域:包括函数的外部和内部范围。

对比:js中,没有超全局的概念。

js中,全局作用域本身就”包括”了局部作用域,即”全局变量”可以在全局范围或局部范围使用。

函数内部使用外部变量

global关键字:本质是设定一个局部变量来引用某个全局变量(引用传址), 删掉该局部变量,全局变量仍然存在;

如果修改该局部变量, 全局变量的值也发生变化;

$v1 = 1; function f2(){ global $v1; echo "<br />函数内:v1 = $v1"; unset($v1); } f2(); echo "<br />函数外:v1 = $v1"; //$v1值依然存在

$GLOBALS数组中的元素跟全局变量是一一对应关系。删掉(unset)一个,另一个也就没有了

$v1 = 1; function f3(){ echo "<br />函数内:v1 = {$GLOBALS['v1']}"; unset($GLOBALS['v1']); } f3(); echo "<br />函数外:v1 = $v1"; //$v1值不存在了

注意: global引用的全局变量只能在函数外部定义, 否则global引用不到全局变量;

关于$GLOBALS超全局变量与普通变量之间的关系

一个包含了全部变量的全局组合数组 。变量的名字就是数组的键。

<?php $a = 1 ; $b = 2 ; function sum (){ $GLOBALS [ 'c' ] = $GLOBALS [ 'a' ] + $GLOBALS [ 'b' ]; echo $GLOBALS['c']; //3 echo $c; //错误的语法 Notice: Undefined variable: c /* 在函数内部还是不能访问, 因为$c已经定义成全局变量(在函数外), 函数的内部是不能访问全局变量 要想访问$c, 需要引入关键字global(引用传址) */ global $c; echo $c; //3 } sum (); echo $c ; //3 正确的语法, 在函数的外部能访问超全局变量 echo $GLOBALS['c']; //3 //$GLOBALS — 引用全局作用域中可用的全部变量 ?>

特例:静态变量——该变量只在函数调用的第一次进行赋初值,其后再调用,不再赋初值,但可以改变其值,而且,其值在函数结束后,仍然保留。

<?php function f1(){ static $c = 0; $c++; echo "<br/>函数调用了{$c}次"; } f1(1); //函数调用了1次 f1(2); //函数调用了2次 f1(3); //函数调用了3次 ?>

变量函数(亦称可变函数)

PHP 支持变量函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且将尝试执行它。

除了别的事情以外,这个可以被用于实现回调函数,函数表等等。

function foo() { echo "In foo()<br />\n"; } function bar($arg = '') { echo "In bar(); argument was '$arg'.<br />\n"; } function echoit($string){ echo $string; } $func = 'foo'; $func(); // This calls foo() $func = 'bar'; $func('test'); // This calls bar() $func = 'echoit'; $func('test'); // This calls echoit()

匿名函数:没有名字的函数(php5.3.0新加入的语法)

有两种使用匿名函数的形式, 或说, 匿名函数有两种存在方式:

方式1:

将匿名函数赋值给一个变量, 最终用的时候, 非常类似”可变函数”。如下:

$f1 = function () {}; //注意,这里最后有一个”分号”——必须的。

上面定义该函数时,没有给名字,那就是匿名函数,并将其整体赋值给了变量$f1;

$f1(); //调用该匿名函数。

<?php $f1 = function(){ echo "<br/>匿名函数被调用,参数为:$p1"; }; //注意:这里最后有一个"分号"--必须的 $f1(1); //调用该匿名函数 $f1(10); //调用该匿名函数 ?>

方式2:

第二种方式的匿名函数, 基本上只作为”实参”使用。

也就是说, 有一些函数, 其实参要求是一个”函数”。

注意:能够使用匿名函数当实参用的函数, 很少很少。

这种函数系统中有这样几个:

call_user_func_array( 匿名函数, 一个数组);

//即函数call_user_func_array带2个参数,第一个参数要求是一个匿名函数,第二个要求是数组

//其作用是:将该数组的所有项,当做该匿名函数的实参传入匿名函数中并执行该匿名函数。

call_user_func_array( function ($p1) { echo "<br />匿名函数被调用,参数为:$p1"; } , array(100) );

输出结果:匿名函数被调用,参数为:100

递归函数:

递归函数即自调用函数, 在函数体内部直接或间接地自己调用自己, 即函数的嵌套调用是函数本身。

该函数必须有一种能够”停止调用”的机制,如使用if语句。该机制,被称为递归函数的”出口”。

实例1

function test($n){ echo $n." "; if($n>0) test($n-1); else echo "<-->"; echo $n." "; } test(10)
输出结果:10 9 8 7 6 5 4 3 2 1 0 <-->0 1 2 3 4 5 6 7 8 9 10

实例2

function test($n){ echo $n." "; if($n>0) test($n-1); else echo "<-->"; } test(10)
输出结果:10 9 8 7 6 5 4 3 2 1 0 <-->

实例3

function test($n){ echo $n." "; if($n>0) test($n-1); else echo "<-->"; echo "递归"; } test(10)
输出结果:10 9 8 7 6 5 4 3 2 1 0 <-->递归递归递归递归递归递归递归递归递归递归递归

可变长度参数列表

func_num_args()

int func_num_args ( void )

返回传递到函数的参数数目

function foo() { $numargs = func_num_args(); echo "Number of arguments: $numargs\n"; } foo(1, 2, 3); // 输出 'Number of arguments: 3' func_get_arg() mixed func_get_arg ( int $arg_num )

返回参数列表的某一项

func_get_args()

array func_get_args ( void )

返回一个包含函数参数列表的数组

命名函数需要注意的事项:

名字不能重复,不能重名。

函数就是一条狗,不叫它名字,它不执行。

函数不要重名,即使是系统函数

函数不能以数字开始,数字可以接到中间和结尾

不能接特殊符号,下划线除外

函数在命名的时候,只有数字,字母,下划线

函数名不区分大小写

函数可以在任意位置调用【注意】

系统函数的使用

系统函数的注意事项:

带bool值的, 通常是操作成功没成功, 或者是对不对, 有没有..

如果看到带mixed的是指可以传入任意类型的数据

带&符的只能够传变量, 传了变量后, 如果函数里面改变值, 函数外面也直接改变值

带[ ]的带表可选, 可以传也可以不传

带…的代表可以传入任意多个元素

callback是传回调函数

函数的参数作为变量是区分大小写, 特殊的情况将回调函数作为参数可以不区分大小写(如array_filter()、array_walk())

有事没事看手册, 练手当中的函数

bool function_exists ( string $function_name )

判断finfo_open()函数是否存在

if(function_exists('finfo_open')){ $finfo = finfo_open ( FILEINFO_MIME_TYPE ); }

如果没有开启fileinfo扩展, 则finfo_open()函数不存在;

或者:

if(!function_exists("fastcgi_finish_request")){ //如果函数不存在的话, 就定义一个空函数 function fastcgi_finish_request(){ } }

设计一个优秀的程序, 其函数的定义规范必须满足两个要求:① 内聚性强 ② 耦合性弱

内聚性强:函数的功能要专一,就是为了完成某个特定功能而实现的。

耦合性弱:函数与函数之间的关系要相对独立, 不存在谁依赖谁的关系。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/123761.html

(0)
上一篇 2024-11-21 11:33
下一篇 2024-11-21 11:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信