大家好,欢迎来到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