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)});
- PHP经典实例读书笔记--函数
- PHP经典实例读书笔记 (函数)
- PHP经典实例读书笔记--字符串
- PHP经典实例读书笔记--数字
- PHP经典实例读书笔记--变量
- PHP经典实例读书笔记--表单
- PHP经典实例读书笔记 (数组)
- PHP经典实例读书笔记 (变量)
- PHP经典实例读书笔记--日期和时间
- PHP经典实例读书笔记--类和对象
- PHP经典实例读书笔记--Web基础
- PHP经典实例读书笔记(练习:日历)
- PHP经典实例读书笔记(字符串,日期,时间)
- PHP经典实例读书笔记 (类和对象)
- 《HTML5经典实例》读书笔记一
- 《HTML5经典实例》读书笔记二
- 《HTML5经典实例》读书笔记三
- php经典实例-笔记3-类与函数篇
- 原根
- MyBatis总结——开发Dao的方法
- Block 一张图秒懂jadeBlock 语法
- Android开发的项目框架的搭建
- chcon -t textrel_shlib_t
- PHP经典实例读书笔记--函数
- Codeforces Round #376 (Div. 2) A. Night at the Museum(水题)
- 并查集详解
- 断点续传
- 关于memcache和Redis的区别和总结
- MFC错误”D8016:‘/ZI’和‘/Gy-’命令行选项不兼容“的解决方法
- 每天一个常用的linux命令(12)--whereis
- C#语法小知识(十二)匿名方法与Lambda表达式
- uva437 DAG