美文网首页
PHP 的函数 -- PHP 学习 (五)

PHP 的函数 -- PHP 学习 (五)

作者: 无故下架内容so账号已弃用 | 来源:发表于2019-04-20 22:57 被阅读0次

    函数是什么

    暂且先记住这句话:
    能够将一段代码封装成一个处理某个特定问题的代码块, , 通过调用的方式来执行, 从而简化代码编写的方法

    函数结构分析

    <?php
        // 函数定义
        function get_sum($a, $b) {
            return $a + $b;
        }
    
        // 函数的调用
        $sum = get_sum(2, 3);
        echo $sum; // 5
    ?>
    

    构成部分:

    1. 关键字: function

    2. 函数名: get_sum

      命名规则: 有效的函数名以字母或下划线开头, 后面可以跟着字母, 数字或下划线

    3. 参数列表: ($a, $b)

    4. 函数体: { return $a + $b }

    5. 返回值: return $a + $b;

      定义:
      (a) 值通过使用可选的返回语句返回
      (b) 可以返回数组和对象的任意类型
      (c) 返回语句会立即终止函数的运行, 并且将控制权交回调用该函数的代码行

    为什么要使用函数

    例子: 从一组数据中找出最大的数

    <?php
        // 从第一组数据中找出最大的数
        $arr1 = array(3, 99, 789, 34, 43, 435);
        $max1 = $arr1[0]; // 先将数组的第一个数据设为最大值
        foreach($arr1 as $v1) {
            // 如果当前的 $max1 小于$v1
            if ($max1 < $v1) {
                $max1 = $v1;
            }
        }
        echo $max1; // 789
    
        echo '<br />';
    
        // 从第二组数据中找出最大的数
        $arr2 = array(34, 45, 5463, 2452, 32452);
        $max2 = $arr2[0]; // 先将数组的第一个数据设为最大值
        foreach($arr2 as $v2) {
            // 如果当前的 $max2 小于$v2
            if ($max2 < $v2) {
                $max2 = $v2;
            }
        }
        echo $max2; //32452
    
        // 如果多组数据...
    ?>
    

    上面的代码实现了对一组数据取最大值,
    如果我们有很多组这样的数据要取最大值,
    那么就要重复的编写上面代码, 但这样是很浪费的一种行为, 这时候我们就可以通过封装一个函数的方法, 通过调用函数的方式来简化我们的编码:

    <?php
        // 取最大值
        function max_num($arr) {
            $max = $arr[0]; // 先将数组的第一个数据设为最大值
            foreach($arr as $v) {
                // 如果当前的 $max1 小于$v1
                if ($max < $v) {
                    $max = $v;
                }
            }
            return $max;
        }
    
        // 从第一组数据中找出最大的数
        $arr1 = array(35,34532,567,564,345);
        $max_val1 = max_num($arr1);
        echo $max_val1; // => 34532
    
        echo '<br />';
    
        // 从第二组数据中找出最大的数
        $arr2 = array(7894, 45, 345, 45, 56, 5);
        $max_val2 = max_num($arr2);
        echo $max_val2; // => 7894
    
        echo '<br />';
    
        // ...
    ?>
    

    函数特性介绍

    <?php
        function get_sum($a, $b) {
            
            $result = $a + $b;
            
            return $result;
        }
    
        // 函数的调用
        $sum = get_sum(2, 3);
        echo $sum;
    ?>
    
    • 函数形参与实参

      $a, $b 是函数的形参,
      2 , 3 函数调用的实参, 实参可以是表达式, 变量等

      形参和实参的数目对应关系:

      (a) 如果 实参数目 < 形参数目: 程序报错/警告

      (b) 如果 实参数目 = 形参数目: 参数会一一对应

      (c) 如果 实参数目 > 形参数目: 程序会正确执行, 形参的值会一一对应, 比如 get_sum(2, 3, 4, 5), 那么 $a = 2, $b=3


    • 函数的默认值
    func ($a, $b, $c, $d = 'default')
    { 
        // .. 
    }
    

    上面给了第四个变量设置的默认值, 如果传参的时候没有传第四个参数, 则第四个参数的值为 default

    例子:

    <?php
        // 函数定义
        function get_sum($a, $b, $c = 60) {
    
            $result = $a + $b + $c;
    
            return $result;
        }
    
        // 函数的调用
        $sum = get_sum(2, 4);
        echo $sum.'<br />'; // 结果: 2 + 4 + 60 = 66
        $sum2 = get_sum(2, 4, 100);
        echo $sum2; // 结果: 2 + 4 + 100 = 106
    ?>
    

    • 函数强类型参数

    定义: 为参数列表中的参数指定类型, 如果传入的数据类型不匹配, 将会抛出 TypeError 异常,

    支持类型:
    PHP 5.0.0: class/interface name
    PHP 5.1.0: array
    PHP 5.4.0: callable
    PHP 7.0.0: bool, float, int, string

    function get_sum(int $a, int $b) {
    
            $result = $a + $b;
    
            return $result;
        }
    

    • 函数可变参数列表

    PHP 5.5及更早版本:
    func_num_args(): 返回参数的总数量
    func_get_arg(): 返回参数列表的某一项
    func_get_args(): 返回一个包含函数参数列表的数组

    <?php
        function test() {
            echo '参数总数: ', func_num_args().'<br />'; // 参数总数: 4
            echo '第一个参数: ', func_get_arg(0).'<br />'; // 第一个参数: 1
            echo '全部参数: '; // => 全部参数: 
            print_r(func_get_args()); // => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
        }
        test(1, 2, 3, 4);
    ?>
    

    PHP 5.6+:
    使用 ... 语法实现:

    <?php
        function test(...$args) {
            echo $args[0].'<br />'; // => 1
            echo count($args).'<br />'; // => 4
            print_r($args); // => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )
        }
        test(1, 2, 3, 4);
    ?>
    

    • 函数值传递与引用传递

    值传递: 不会改变原来实参的值

    <?php
        function test($num) {
            $num = 5;
            $result  = $num + 1;
            return $result;
        }
    
        $num = 4;
        $res = test($num);
        echo $res.'<br />'; // => 6
        echo '$num: '.$num; // => $num: 4 ,$num 的值并没有被修改
    ?>
    

    引用传递: 通过 & 来实现, 赋值给形参的是引用地址

    <?php
        function test(&$num) {
            $num = 5;
            $result  = $num + 1;
            return $result;
        }
    
        $num = 4;
        $res = test($num);
        echo $res.'<br />'; // => 6
        echo '$num: '.$num; // => $num: 4 ,$num 的值也改变了
    ?>
    

    • 函数变量作用域

    局部变量:

    1. 当前页面中声明的普通变量, 不能在函数中或者类中起作用;
    <?php
        $a = 12;
        function test() {
            echo $a; // => 报错: Undefined variable: a
        }
    
        test();
    ?>
    
    1. 当前页面中声明的普通变量, 不能被传递到其他页面;
    2. 在函数中声明的普通变量, 在函数内部有效;
    <?php
        function test() {
            $a = 12;
        }
        test();
        echo $a; // => 报错: Undefined variable: a
    ?>
    
    1. 在类中声明的属性, 在类的内部有效;

    全局变量 global

    对于 PHP 而言, 可以这么说, 在页面中生成的变量都是全局变量, 在整个页面都是有效, 但是不能被函数或者类中的方法访问;

    如果想被函数或者类中的方法访问, 我们就有了超全局变量:
    $_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, $_REQUEST, $_SEESION

    <?php
        $a = 12;
        $b = 24;
        $c = 29;
        function test() {
            global $b;
            echo $a; // => Undefined variable: a
            echo $b.'<br />'; // => 24
            echo $GLOBALS['c']; // => 29
        }
    
        test();
    ?>
    

    global 和 GLOBALS 使用的区别: global 是外部同名变量的引用, 而GLOBELS 外部的全局变量的本身

    静态变量 static

    函数内部声明的变量, 函数执行完即销毁,
    而通过 static 声明的静态变量. 函数执行完之后并未丢失

    <?php
        function test() {
            $a = 1;
            $a++;
            echo $a;
        }
    
        test(); // => 2
        echo '<br />';
        test(); // => 2
        // ...
    ?>
    

    通过 static 标识的静态变量

    <?php
        function test() {
            static $a = 1;
            $a++;
            echo $a;
        }
    
        test(); // => 2
        echo '<br />';
        test(); // => 3
        echo '<br />';
        test(); // => 4
    ?>
    

    参考资料:
    https://www.imooc.com/learn/827
    http://www.php.cn/php-weizijiaocheng-390860.html

    相关文章

      网友评论

          本文标题:PHP 的函数 -- PHP 学习 (五)

          本文链接:https://www.haomeiwen.com/subject/zcaqgqtx.html