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

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值