6. 函数

作者: 57fc17b7d598 | 来源:发表于2017-06-23 13:47 被阅读9次

    基本介绍

    函数是一组用来执行多条语句的代码块,它能够接受参数和返回数据,其用途需明确,其逻辑需具有整体性,否则便没有存在的意义。

    function example(string $name, int $age){
        echo "大家好,我叫 $name <br />";
        echo "我出生于:" . (date('Y') - $age) . "年 <br />";
        return "谢谢!";
    }
    echo example("iGuoji", 26);
    

    上例是一个简单的函数,它具有参数和返回值,也有自己的功能和逻辑。

    函数中可以存在函数、类、以及任何其他有效的PHP代码。

    函数的命名规则如变量的命名规则一样,但不区分大小写

    函数不支持重载,也不能取消定义或是重复定义。

    函数无需在被调用之前定义,但也不是那么的绝对,有点类似 ES6 中的变量提升。

    // 提前调用
    echo example("iGuoji", 26);
    
    // 定义函数
    function example(string $name, int $age){
        echo "大家好,我叫 $name <br />";
        echo "我出生于:" . (date('Y') - $age) . "年 <br />";
        return "谢谢!";
    }
    
    // 再次提前调用另一个函数
    foobar();
    
    // 结果自然是报错了
    if(TRUE){
        function foobar(){
            echo 'hello world';
        }
    }
    

    上例中的两个函数调用和定义都差不多,区别是一个直接定义的,另一个是在某个条件达成之下才定义,所以由此可知,PHP在解析的时候只是粗略的扫了一眼,知道第一个函数可以直接定义,但是第二个函数还需要条件判断成功才能定义,所以PHP只处理第一个,第二个先不管。

    简单而言,函数在被调用之前,不能存在按条件定义

    PHP 中的所有函数和类都具有全局作用域,不用管它是在哪里定义的。

    // 如果不先调用我,那么下面的每一行代码都将出错
    example();
    
    // 函数调用
    foobar();
    // 静态方法调用
    Laravel::register();
    // 类的实例化
    $laravel = new Laravel();
    $laravel->boot();
    
    
    // 定义函数
    function example(){
        // 函数中的函数
        function foobar(){
            echo "hello ";
        }
        // 函数中的类
        class Laravel{
            public function boot(){
                echo 'world';
            }
            static function register(){
                echo '<p>PHP 是世界上最好的语言</p>';
            }
        }
    }
    
    // 最终输出
    /*
    hello
    PHP 是世界上最好的语言
    world
    */
    

    参数介绍

    参考:6.1 函数参数

    返回值

    函数的返回值通过return语句来执行,可以返回一个任意类型的数据给函数调用者,同时终止函数执行,不能同时返回多个数据,但可以返回一个数组来达到类似的效果。

    返回值的类型,可以在函数定义时进行声明,非严格模式下会尽量进行自动转换来达到预期的效果,实在转换不了或是严格模式下就会直接报错。

    // 求和函数
    function sum(int $x, int $y) : int{
        return $x + $y;
    }
    // 输出 3
    echo sum(1, 2.5);
    

    当一个父类中的方法声明了返回值类型时,另一个子类在重写这个方法时,也必须声明相同类型的返回值,如果父类没有声明返回值类型,则子类可以随意发挥。

    可变函数

    参考:6.2 可变参数

    匿名函数

    匿名函数,也叫做闭包函数,是指一个没有名字临时创建的函数,通常用做回调函数。

    匿名函数目前是通过 Closure 类来实现的。

    匿名函数特点之一,结尾的大括号后面需要加分号,如};,否则报错后会让你怀疑人生。

    // 匿名函数
    $foobar = function(){
        echo "hello world";
    };
    // 输出 hello world
    $foobar();
    

    匿名函数特点之二,通过 use 可以继承父作用域里的变量。

    // 普通变量
    $string = "hello world";
    
    // 匿名函数
    $foobar = function() use ($string){
        echo $string;
    };
    
    // 输出 hello world
    $foobar();
    

    需要注意的是,use 不能传递超全局变量、$this、或是和参数重名的变量,而且传递的 方式是值传递

    相关文章

      网友评论

          本文标题:6. 函数

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