ddxiami

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3333|回复: 8

[细说PHP] 第8章PHP函数的应用--声明及应用各种形式的PHP函数

[复制链接]
发表于 2013-7-31 17:42:15 | 显示全部楼层 |阅读模式
让其他人用的函数应该包含功能描述、参数说明、返回值这三方面的帮助信息

<?php
        /**
                定义一个计算两个整数平方和的函数
                @param        int $i        第一个整数参数,作为一个运算数
                @param        int $j        第二个整数参数,作为另一个运算数
                @return        int                返回一个整数,是计算后平方和的值
        */
        function test( $i, $j ) {
                $sum = 0;                                                //声明一个变量用于保存计算后的结果
                $sum = $i*$i + $j*$j;                        //计算两个数的平方和
                return $sum;                                        //返回值,返回计算后的结果
        }
       
        echo test(2, 5);                                        //应用函数
回复

使用道具 举报

 楼主| 发表于 2013-8-1 10:50:01 | 显示全部楼层
引用参数的函数

函数内部改变参数的值,不会改变函数外部的值
<?php
        /**
                声明一个函数test,用于测试参数
                @param        int        $arg                需要一个整型值参数
        */
        function test( $arg ) {            
                $arg = 200;                         //在函数中改变参数$a的值为200
        }
       
        $var = 100;                                    //在父程序中声明一个全局变量$var,初值为100
        test($var);                                    //调用test函数,并将变量$var的值100传给函数的参数$arg
        echo $var;                                    //输出100。$var的值没有变化
?>

让函数的一个参数总是通过引用传递,在函数定义中,在参数的前面预先加上符号“&”即可。在调用该函数时必须传入一个变量给这个参数,而不能传递一个值。
<?php
        /**
                声明一个函数test,用于测试参数
                @param        int        $arg                需要一个整型值参数,使用'&'将按引用方式传递参数,参数必须是变量
        */
        function test( &$arg ) {            
                $arg = 200;                         //在函数中改变参数$a的值为200,$arg是引用参数,外部变量$var也被修改
        }
       
        $var = 100;                                    //在父程序中声明一个全局变量$var,初值为100
        test($var);                                    //调用test函数,并将变量$var的引用传给函数的参数$arg
        echo $var;                                    //输出200。$var的值在函数中修改变量$arg时被修改
?>

系统函数雨一些函数需要传递一个变量给引用参数,这个参数变量本身的值也会在父程序中被改变。例如,数组处理函数中的next()、sort()、shuffle、key()等函数都是引用参数的函数。
<?php
        $arr = array( 1, 5, 8, 4, 6, 2, 9 );                //声明一个数组,元素成员的顺序是打乱的
        print_r( $arr );                                                        //输出排序前数据的顺序
       
        sort( $arr );                                                                //使用sort()函数排序,必须传入一个数组变量
        print_r( $arr );                                                        //数组$arr排序后的结果输出
?>



回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 11:17:23 | 显示全部楼层
默认参数的函数

<?php
        /**
                自定义一个函数名称为person,用于打印一个人的属性
                @param        string        $name        人的名子属性字符串,默认值为"张三"
                @param        int                $age                人的年龄属性,默认值为20
                @param        string        $sex                人的性别属性,默认值为"男"
        */
        function person( $name="张三", $age=20, $sex="男" ){  
                echo "我的名字是:{$name}, 我的年龄为:{$age}, 性别: {$sex} <br>";
        }
       
        person();                                //在调用函数时三个参数都没有传值,全部使用默认参数
        person("李四");                           //第一个默认参数被传入的值覆盖,后两个参数使用默认参数
        person("王五", 22);                        //前两个默认参数被传入的值覆盖,最后一个参数使用默认参数
        person("贾六", 18, "女");           //在调用函数时,三个默认参数都被传入的值覆盖
?>


错误范例1
<?php
        /**
                自定义一个函数名称为person,用于打印一个人的属性
                @param        string        $name        人的名子属性字符串,默认值为"张三"
                @param        int                $age                人的年龄属性
                @param        string        $sex                人的性别属性
        */
        function person( $name="张三", $age, $sex){  
                echo "我的名字是:{$name}, 我的年龄为:{$age}, 性别: {$sex} <br>";
        }
       
        person("李四");                   //第一个默认参数被传入的值覆盖,后两个参数没有传值,会出现2条警告报告
?>


错误范例2
<?php
        /**
                自定义一个函数名称为person,用于打印一个人的属性
                @param        string        $name        人的名子属性字符串
                @param        int                $age                人的年龄属性
                @param        string        $sex                人的性别属性,默认值为“男”
        */
        function person( $name=, $age, $sex="男" ){  
                echo "我的名字是:{$name}, 我的年龄为:{$age}, 性别: {$sex} <br>";
        }
       
        person("李四", 20);                   //前两个参数传值,没有为最后一个参数传值,则使用默认值“男”
?>

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 13:18:00 | 显示全部楼层
可变个数参数的函数

<?php
        /**
                声明一个函数more_args(),用于打印参数列表的值
                虽然没有声明参数列表,但可以传入任意个数,任意类型的参数值
        */
        function more_args() {           
                $args = func_get_args();                                                    //将所有传递给脚本函数的参数当做一个数组返回
                for($i=0; $i<count($args); $i++) {               //使用for循环遍历数组$args
                        echo "第".$i."个参数是".$args[$i]."<br>";    //分别输出传入函数的每个参数
                }
        }
        more_args("one", "two", "three", 1, 2, 3);           //调用函数并输入多个参数
?>


<?php
        /**
                声明一个函数more_args(),用于打印参数列表的值
                虽然没有声明参数列表,但可以传入任意个数,任意类型的参数值
        */
        function more_args() {           
                for($i=0; $i<func_num_args(); $i++) {                              //使用for循环遍历数组$args
                        echo "第".$i."个参数是".func_get_arg($i)."<br>";    //分别输出传入函数的每个参数
                }
        }
        more_args("one", "two", "three", 1, 2, 3);                           //调用函数并输入多个参数
?>

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 13:59:47 | 显示全部楼层
回调函数--变量函数

<?php
        /** 声明第一个函数one, 计算两个数的和
                @param        int        $a        计算和的第一个运算元
                @param        int        $b        计算和的第二个运算元
                @return        int                返回计算后的结果
        */
        function one( $a, $b ) {
                return $a + $b;
        }
       
        /** 声明第二个函数two, 计算两个数的平方和
                @param        int        $a        计算平方和的第一个运算元
                @param        int        $b        计算平方和的第二个运算元
                @return        int                返回计算后的结果
        */
        function two($a, $b) {
                return $a*$b + $b*$b;
        }
       
        /** 声明第三个函数three, 计算两个数的立方和
                @param        int        $a        计算立方和的第一个运算元
                @param        int        $b        计算立方和的第二个运算元
                @return        int                返回计算后的结果
        */
        function three($a, $b) {
                return $a*$a*$a + $b*$b*$b;
        }
       
        $result = "one";                                        //将函数名"one"赋给变量$result, 执行$result()时则调用函数one()
        //$result = "two";                                        //将函数名"two"赋给变量$result, 执行$result()时则调用函数two()
        //$result = "three";                                        //将函数名"three"赋给变量$result, 执行$result()时则调用函数three()
       
        echo "运算结果是:".$result(2, 3);        //变量$result接收到哪个函数名的值,就调用哪个函数
?>
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 14:07:17 | 显示全部楼层
回调函数--使用变量函数声明和应用回调函数

<?php
        /** 声明回调函数filter, 在0-100的整数中通过自定义条件过滤不要的数字
                @param        callback                $fun                需要传递一个函数名称字符串作为参数
        */
        function filter( $fun ) {
                for($i=0; $i <= 100; $i++) {
                        //将参数变量$fun加上一个圆插号$fun(), 则为调用和变量$fun值同名的函数
                        if( $fun($i) )
                                continue;
                               
                        echo $i.'<br>';       
                }
        }
       
        /** 声明一个函数one, 如果参数是3的倍数就返回true, 否则返回false
                @param        int        $num                需要一个整数作为参数       
        */
        function one($num) {
                return $num%3 == 0;
        }
       
        /** 声明一个函数two, 如果参数是一个回文数(翻转后还等于自己的数)返回true, 否则返回false
                @param        int $num                需要一个整数作为参数
        */
        function two($num) {
                return $num == strrev($num);
        }
       
        filter("one");                //打印出100以内非3的倍数,参数"one"是函数one()的名称字符串,是一个回调
        echo '--------------------<br>';
        filter('two');                //打印出100以内非回文数,参数"two"是函数two()的名称字符串,是一个回调
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 14:31:54 | 显示全部楼层
回调函数--借助call_user_func_array()函数自定义回调函数

<?php
        /** 声明一个函数fun(), 功能只输出两个字符串,目的是作为call_user_func_array()回调参数
                @param        string        $msg1        需要传递一个字符串作为参数
                @param        string        $msg2        需要传递另一个字符串作为参数
        */
        function fun($msg1, $msg2) {
                echo '$msg1 = '.$msg1;
                echo '<br>';
                echo '$msg2 = '.$msg2;
        }
       
        /**        通过系统函数call_user_func_array() 调用函数fun()
                第一个参数为函数fun()的名称字符串
                第二个参数则是一个数组,每个元素值会按顺序传递给调用的fun()函数参数列表中
        */
        call_user_func_array('fun', array('LAMP', '兄弟连'));
       


回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 14:55:45 | 显示全部楼层
回调函数--类静态函数和对象的方法回调

<?php
        /* 声明一个类Demo,类中声明一个静态的成员方法fun() */
        class Demo {
                static function fun($msg1, $msg2) {
                        echo '$msg1 = '.$msg1;
                        echo '<br>';
                        echo '$msg2 = '.$msg2;
                }
        }
       
        /* 声明一个类Test, 类中声明一个普通的成员方法fun()  */
        class Test {
                function fun($msg1, $msg2) {
                        echo '$msg1 = '.$msg1;
                        echo '<br>';
                        echo '$msg2 = '.$msg2;
                }
        }
       
        /** 通过系统函数call_user_func_array()调用Demo类中的静态成员方法fun(),
                回调类中的成员方法:第一个参数必须使用数组,并且这个数组需要指定两个元素,
                第一个元素为类名称字符串,第二个元素则是该类中的静态方法名称字符串。
                第二个参数也是一个数组,这个数组中每个元素值会按顺序传递给调用Demo类中的fun()方法参数列表中。
        */
        call_user_func_array( array("Demo", 'fun'), array('LAMP', '兄弟连') );
       
        /** 通过系统函数call_user_func_array()调用Test类的实例对象中的成员方法fun(),
                回调类中的成员方法:第一个参数必须使用数组,并且这个数组需要指定两个元素,
                第一个元素为对象引用,在本例也可以是$obj=new Test()中的$obj, 第二个元素则是该对象中的成员方法名称字符串。
                第二个参数也是一个数组,这个数组中每个元素值会按顺序传递给调用new Test()对象中的fun()方法参数列表中。
        */
        call_user_func_array( array(new Test(), 'fun'), array('BroPHP', '学习型PHP框架') );
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 17:33:40 | 显示全部楼层
使用自定义函数库
require()语句通常放在PHP脚本程序的最前面,include()语句一般是放在流程控制的处理区段中。
require_once()和include_once()的唯一区别是如果该文件的代码已经被包括了,则不会再次包括。这两个语句应该用于脚本执行期间,同一个文件有可能被包括超过一次的情况,确保它只能被包括一次

<?php
        require 'config.php';                          //使用require语句包含并执行config.php文件

        if ($condition)                               //在流程控制中使用include语句
                  include 'file.txt';                        //使用include语句包含并执行file.txt文件
        else                                               //条件不成立则包含下面的文件
              include ('other.php');                     //使用include语句包含并执行other.php文件

        require ('somefile.txt');                //使用require语句包含并执行somefile.txt文件


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|技术文档库 ( 闽ICP备15017263号-2 )|网站地图

GMT+8, 2025-5-19 03:29 , Processed in 0.036922 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表