前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP函数

PHP函数

原创
作者头像
码一
发布2022-06-01 10:32:40
2.9K0
发布2022-06-01 10:32:40
举报
文章被收录于专栏:码园

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

用户自定义函数

代码语言: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
复制
<?php
function foo(&$arg)
{
    $arg = 1;
}

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

  • 参数默认值
代码语言:php
复制
<?php
function foo($arg='demo')
{
    var_dump($arg);
}

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

  • 可变数量参数
代码语言:php
复制
<?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()函数来获取可变参数

  • 命名参数 <sub>PHP 8</sub>

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

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

代码语言:php
复制
<?php
  
function foo(first_num: $a, last_num: $b)
{
    return $a + $b;
}  

返回值

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

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

代码语言:php
复制
<?php
function foo()
{
    return ['one', 'two'];
}
list($a, $b) = foo();

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

代码语言:php
复制
<?php
function &foo()
{
    $a = 1;
    return $a;
}
$b = &foo();

可变函数

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

代码语言: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
复制
<?php
$a = 1;
$fun = functon ($b) use ($a) {
    echo $a + $b;
};

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

代码语言:php
复制
<?php

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

箭头函数 <sub>PHP 7.4</sub>

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

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

代码语言:php
复制
<?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 <sub>PHP 8.1</sub>

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

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

// PHP8.1
$closure = strlen(...);
var_dump($closure('demo'));

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档