概述
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经典实例读书笔记--函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复