PHP函数

本文是复习所写,并不会涵盖一些基础知识点

用户自定义函数

 <?php
 ​
 /**
  * 示例函数
  *
  * @param mixed $arg1 参数一
  * @param mixed $arg2 参数二
  * @param mixed $argN 参数N
  * @return mixed 
  */
 function foo($arg1, $arg2, $argN)
 {
     return 'called!';
 }
  • PHP中函数是全局的,只要定义了就可以在任何地方调用

  • 函数内部可以写任何有效的PHP代码,就算定义函数和类也是可以的

  • PHP不支持函数重载,也不能取消定义和重写义已声明函数

  • 递归调用时,要避免超过100~200层

函数参数

  • 引用传参

     <?php
     function foo(&$arg)
     {
         $arg = 1;
     }

    在参数前面加上&可以将值传递变为引用传递,在函数内对变量做的操作会改变函数外的变量

  • 参数默认值

     <?php
     function foo($arg='demo')
     {
         var_dump($arg);
     }

    默认值必须是常量表达式,不能是变量、类成员、函数调用等

  • 可变数量参数

     <?php
     function foo($arg, ...$args)
     {
         var_dump($arg);
         var_dump($args);
     }
     foo(1,2,3,4,5);
     foo([1,2,3]);

    在参数前加...来标识这个参数是可变参数

    可变参数只能是参数列表中最后一个

    也可以通过func_num_args()func_get_arg()func_get_args()函数来获取可变参数

  • 命名参数 PHP 8

    有了命名参数后在调用函数时就可以忽略参数顺序,配合参数默认值使用的话就可以在使用函数时只传需要的参数而不必要将无意义的值也传上

    命名参数通过在参数名前加上冒号来传递,可以使用保留关键字,但不能使用变量

     <?php
     ​
     function foo(first_num: $a, last_num: $b)
     {
         return $a + $b;
     }
     ​
     ​

返回值

使用return可以返回任何类型数据,return会立即终止函数的执行,并将执行权交还给调用者

可以使用list解包数组类型的返回值

 <?php
 function foo()
 {
     return ['one', 'two'];
 }
 list($a, $b) = foo();

函数返回引用类型值时,函数声明和函数调用前都必须加&

 <?php
 function &foo()
 {
     $a = 1;
     return $a;
 }
 $b = &foo();

可变函数

如果变量名后有(),PHP将寻找与变量的值同名的函数,并尝试执行

 <?php
 ​
 $funName = 'foo';
 ​
 // 函数
 function foo($a)
 {
     var_dump($a);
 }
 $funName('demo');
 ​
 // 类方法
 class Test()
 {
     static $foo = 'attribute';
     
     public function foo($a)
     {
         var_dump($a);
     }
     
     public static function two($a)
     {
         var_dump($a);
     }
     
 }
 (new Test())->$funName('test'); // 方式一
 ​
 $fun = ['Test', 'foo']; // 方式二
 $fun();
 ​
 $fun = [new Test, 'foo']; // 方式三
 $fun();
 ​
 $fun = 'Test::two'; // 类静态方法
 $fun();

内部函数

PHP有很多内置函数,有些函数是需要和特定的扩展一起编译

function_exists()判断函数是否存在

get_extension_funcs()获取某个模块的函数列表

dl()加载模块

匿名函数

匿名函数是通过Closure类来实现

匿名函数可以用use来从父类继承变量,也可以定义参数

<?php
$a = 1;
$fun = functon ($b) use ($a) {
    echo $a + $b;
};

在类中使用时,会在匿名函数内部自动绑定$this

<?php

class Test()
{
    public $attr = 1;
    
    public function foo()
    {
        return function (){
            var_dump($this);
        }
    }
    
    // 当不需要自动绑定时,可以将匿名函数静态化
    public function two()
    {
        return static function() {
            var_dump($this);
        }
    }
}

箭头函数 PHP 7.4

箭头函数跟匿名函数一样,都是通过Closure实现,只是比匿名函数更简洁,也只能实现比较简单的功能

箭头函数会自动捕获父作用域变量进行值拷贝

<?php
$x = 1;
$fn = fn($a, $b) => $a + $b + $x;
var_dump($fn(1, 2));

// 箭头函数可以嵌套
$fn = fu($a) => fu($b) => $a + $b;
var_dump($fn(1)(2));

First class callable syntax PHP 8.1

这是一中引用闭包的新方法

<?php
// PHP8.1之前
// 使用Closure将函数转成闭包形式
$closure = Closure::fromCallable('strlen');
var_dump($closure('sssss'));

// PHP8.1
$closure = strlen(...);
var_dump($closure('demo'));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值