PHP经典实例读书笔记--函数

来源:互联网 发布:诚造社变形金刚淘宝 编辑:程序博客网 时间:2024/05/21 19:39

1、PHP函数定义

  • PHP函数主要作用是创建可重用的代码,便于维护
  • 使用function声明函数,后面是这个函数的函数名和参数
  • 调用PHP函数之前不需要提前声明,但是不能重复定义函数
//不需要声明参数的变量类型function add($a,$b){    return $a+$b;}

2、访问函数参数

问题:

希望访问传递到一个函数的值。

解决方案:

使用函数原型中的名,除非特别指定,否则传入函数或从函数返回的所有非对象值都是按值传递(默认地,对象将按引用传递),所以函数不会修改变量的值。

示例

function greet($name){    echo "hello! ".$name;}//使用greet('Jack');//输出hello! Jack

很多其他程序中,按引用传递速度比按值传递速度快,但是在PHP中,他们之间相差不大,所以通常情况下使用按值传递。


3、为函数设置默认值

问题:

希望一个参数有一个默认值,这样当函数调用者没有为这个函数传入值是,可以取一个默认值。

解决方案:

可以在函数原型中为函数指定默认值。

示例

//所有默认值参数必须出现在没有默认值参数的后面//参数默认值必须是一个常量(如字符串和数字),而不能是一个变量function wrap_in_html_tag($text,$tag='strong'){    return "<$tag>$text</$tag>"}//使用wrap_in_html_tag('hello! Jack');//输出<strong>hello! Jack</strong>

4、按引用传递值

问题:

希望向函数传递一个变量,并保留函数中对这个变量值的所有修改。

解决方案:

要让函数接受一个按引用传递的参数而不是按值传递的参数,需要在函数原型中该参数名前面加一个&。

示例

//所有默认值参数必须出现在没有默认值参数的后面//参数默认值必须是一个常量(如字符串和数字),而不能是一个变量function wrap_in_html_tag(&$text,$tag='strong'){    $text = "<$tag>$text</$tag>"    //现在不必要将$text返回,已经修改了。可以用于返回true和false    return true;}//如果一个参数声明为接受按引用传递的参数,那这个参数就不能是一个常量字符串。//使用$text = 'hello! Jack';wrap_in_html_tag($text);print $text;//输出<strong>hello! Jack</strong>

5、使用命名参数

问题:

希望按名来为函数指定参数,而不是通过函数参数的位置来确定。

解决方案:

PHP不支持语言级命名参数,但是可以将需要传递的参数转化为一个关联数组,用需要使用它的名字作为其键,这样,就能模拟命名参数。

示例

function image($img){    //通常情况下,需要先判断$img数组对应的值是否已经设置    $tag = '<img src="'.$img['src'].'" ';    $tag.='alt="'.$img['alt'].'"/>';    return $tag;}//使用$img = array('src'='http://www.baidu.com/1.jpg',alt='nice');print image($img);//输出<img src="http://www.baidu.com/1.jpg" alt='nice'/>

6、强制函数参数的类型

问题:

希望确保参数值有某种数据类型。

解决方案:

定义函数参数是可以对参数使用类型提示。类型提示放在函数声明中参数名的前面。

示例

function image(array $img){    //指定函数参数的数据类型,类型可以是一个类名,接口名,array,callable    //指定数据类型的同时,可以设置默认值    //通常情况下,需要先判断$img数组对应的值是否已经设置    $tag = '<img src="'.$img['src'].'" ';    $tag.='alt="'.$img['alt'].'"/>';    return $tag;}//使用$img = array('src'='http://www.baidu.com/1.jpg',alt='nice');print image($img);//输出<img src="http://www.baidu.com/1.jpg" alt='nice'/>

7、创建参数个数可变的函数

问题:

希望定义一个参数个数可变的函数。

解决方案:

向函数传入一个数组类型的参数,并将可变的参数放在这个数组中。

示例

//常用的方法,但是有一定的开销function mean($number){    $sum=0;    foreach($number as $nu){        $sum+=$nu;    }    return $sum/count($number);}//直接访问参数表function mean(){    //获取参数的个数    $size=func_num_args();    //获取每一个元素的值    $sum=0;    for($i=0;$i<$size;$i++){        $sum+=func_get_arg($i);    }    return $sum/$size;}//使用$mean = mean(array(1,2,3,4,5));//输出3

扩展:func_get_arg() 的相关文档参考http://www.php.net/func-get-arg


8、按引用返回值

问题:

希望按引用返回一个值,而不是按值返回。这样就无需为变量建立一个重复的副本。

解决方案:

按引用返回变量的语法与按引用穿了变量很类似。不过,并不是在参数前加一个&,而是把&放在函数名前面。

示例

function &array_find_value($needle,&$haystack){    foreach($haystack as $key => $value){        if($needle == $value){            //返回的是变量的一个引用,便于在外面修改            return $haystack[$key];            //错误,不能直接返回字符串            //return 'This is var';        }    }}//调用这种函数时,必须使用 =& 方式,而不是 =,$band是一个变量的引用$band =& array_find_value('The Doors',$artists);//将'The Doors'修改为'The Door'$band = 'The Door';//函数返回引用时,必须返回一个变量的引用,而不是一个字符串。

9、返回多个值

问题:

希望函数返回多个值。

解决方案:

返回一个数组,并使用list()分解出元素。

示例

function array_stats(array $value){    $min = min($value);    $max = max($value);    $mean = array_sum($value)/count($value);    //这样的性能不是很高,会先建立一个数组,再将其销毁,浪费资源    return array($min,$max,$mean);}$values = array(1,2,3,5,4);list($min,$max,$mean)=array_stats($values);//对于一个函数中返回多个值,而你只关心其中几个,可以使用list()来省略。list(,,$mean)=array_stats($values);

10、在函数中访问全局变量

问题:

需要在函数中访问一个全局变量。

解决方案:

用global关键字将全局变量引入到局部作用域,或者使用$GLOBALS 数组。

示例

//通过global来引入全局变量function eat_fruit($fruit){    global $chew_count;    //通过global引入的全局变量unset时,只在该函数内部有效。    for($i=$chew_count;$i>0;$i--){        /* ... */    }}//通过$GLOBALS数组来引入全局变量function eat_fruit($fruit){    //通过$GLOBALS引入的全局变量unset时,全局有效。    for($i=$GLOBALS['chew_count'];$i>0;$i--){        /* ... */    }}

11、创建动态函数

问题:

希望在函数运行时创建和定义一个函数。

解决方案:

使用闭包语法来定义一个函数,并把它存储在一个变量中,闭包就是匿名函数

示例

//使用闭包$increment =7;$add = function($i,$j) use($increment){return $i+$j+$increment};$sum = $add(1,2);//匿名函数举例$files = array('ziggy.txt','10steps.doc','11pants.org');usort($files,function($a,$b){return strnatcmp($b,$a)});
0 0
原创粉丝点击