PHP8的匿名函数-PHP8知识详解

    时间: 浏览:488次  来源:PHP服务网
导读:PHP8引入了匿名函数(AnonymousFunctions),它是一种创建短生命周期的函数,不需要命名,并且可以在其作用域内直接使用。以下是在PHP8中使用匿名函数的知识要点。

php 8引入了匿名函数(Anonymous Functions),它是一种创建短生命周期的函数,不需要命名,并且可以在其作用域内直接使用。以下是在PHP 8中使用匿名函数的知识要点:


1、创建匿名函数,语法格式如下:

$fn = function() {  
    // 匿名函数的代码  
};

使用function关键字创建一个匿名函数。下面是一个示例:

<?php
$fn = function($arg1, $arg2) {  
    // 匿名函数的代码  
    return $arg1 + $arg2; 
};
echo $fn(3, 4);
?>

以上代码在PHP8中输出的结果为:

7

在上述示例中,我们向匿名函数传递了值 $arg1 = 3 和 $arg2 = 4,并输出结果为 7。请根据您的需求修改参数的值。


2、匿名函数可以作为变量赋值给其他变量,也可以作为参数传递给其他函数或方法。示例代码:

<?php
// 将匿名函数赋值给变量
$myFunction = function($arg1, $arg2) {
    // 匿名函数的代码
    return $arg1 + $arg2;
};

// 使用变量中的匿名函数进行计算
$result = $myFunction(3, 4);
echo $result; // 输出 7
echo "<br>";

// 将匿名函数作为参数传递给其他函数或方法
function operate($a, $b, $func) {
    return $func($a, $b);
}

$result = operate(5, 2, function($x, $y) {
    return $x * $y;
});

echo $result; // 输出 10

?>

在PHP8中运行的结果为:

7
10

在上面的示例中,我们首先将匿名函数赋值给变量 $myFunction,然后使用该变量调用匿名函数并将结果存储在 $result 变量中。

接下来,我们定义了一个 operate() 函数,它接受三个参数:两个操作数 $a 和 $b,以及一个匿名函数 $func。在 operate() 函数内部,我们通过调用 $func($a, $b) 来执行传递进来的匿名函数,并返回其结果。

最后,我们使用了另一个匿名函数作为参数传递给 operate() 函数,并对数字进行相乘操作,将结果输出。


3、匿名函数可以访问其作用域内的变量,这些变量被称为闭包变量(Closure Variables)。在匿名函数内部,可以使用use关键字来引用外部变量。

<?php
$variable = 'php';  
$fn = function() use ($variable) {  
    echo $variable;  
};  
$fn(); 
?>

以上代码在PHP8中,输出的结果为:

php


4、匿名函数也可以返回值,就像普通函数一样。可以在匿名函数内部使用return语句来返回值。示范代码:

<?php
$fn = function() {  
    return 'php';  
};  
echo $fn(); 
?>

以上代码在PHP8中的运行结果为:

php


5、匿名函数可以作为回调函数使用,例如在数组排序、异步操作等场景中。可以使用callable类型来指定匿名函数作为回调函数。示范代码:

<?php
$numbers = [4, 2, 8, 6, 1];

// 使用匿名函数进行数组排序
usort($numbers, function ($a, $b) {
    return $a - $b;
});

print_r($numbers);
?>

在PHP8中运行的结果为:

array ( [0] => 1 [1] => 2 [2] => 4 [3] => 6 [4] => 8 )

在这个例子中,我们使用了usort函数对$numbers数组进行排序。第二个参数是一个匿名函数,它接受两个参数$a和$b,并返回一个整数值来指定元素之间的比较关系。通过使用匿名函数作为回调函数,我们可以根据自己的逻辑来定义排序规则。

请注意,在使用匿名函数作为回调函数时,可以直接将匿名函数写在函数调用的参数列表中,而不需要定义一个独立的函数体。这样可以使代码更加简洁和易读。


6、匿名函数也可以使用闭包绑定(Closure Binding),即将匿名函数绑定到特定的对象或类。通过使用bind方法,可以将匿名函数绑定到特定的对象上。

示范代码:

<?php
class MyClass {
    private $message = "Hello";

    public function sayHello() {
        $func = function() {
            echo $this->message;
        };

        $boundFunc = $func->bindTo($this, 'MyClass');
        $boundFunc();
    }
}

$obj = new MyClass();
$obj->sayHello();
?>

以上代码在PHP8中运行结果为‘:

Hello

在上述示例中,我们创建了一个名为MyClass的类,该类具有一个私有属性message和一个公共方法sayHello。

在sayHello方法内部,我们定义了一个匿名函数$func,它尝试访问$this->message。然后,我们使用bindTo方法将匿名函数绑定到当前对象$this上,并指定绑定到MyClass类。

最后,我们调用绑定后的函数$boundFunc(),这样就可以在匿名函数中成功访问到$this->message的值。

请注意,这里的关键是使用bindTo方法将匿名函数与特定的对象或类进行绑定。这样做的好处是,匿名函数仍然保持其原始定义中访问外部作用域变量的能力,同时又能够正确地访问绑定的对象或类的成员。


7、匿名函数还可以使用闭包模拟(Closure Simulation),即创建一个模拟闭包来访问外部变量。这在使用旧版本的PHP时非常有用,因为匿名函数在旧版本中不可用。通过使用命名函数和命名函数的变量绑定,可以模拟闭包的行为。示范代码:

<?php
function createClosure($outerVariable) {
    return function() use ($outerVariable) {
        echo "Outer variable value: " . $outerVariable;
    };
}

// 创建一个模拟闭包
$closure = createClosure("Hello, world!");

// 执行闭包
$closure(); 
?>

在php8zhon运行的结果为:

Outer variable value: Hello, world!


8、静态匿名函数

匿名函数允许被定义为静态化。这样可以防止当前类自动绑定到它们身上,对象在运行时也可能不会被绑定到它们上面。示范代码:

<?php
class MyClass {
   private static $message = 'Hello';

   public function testCallback() {
      $callback = static fn() => self::$message;
      echo $callback(); // 输出:Hello
   }
}

$obj = new MyClass();
$obj->testCallback();
?>

在上面的代码中,我们将匿名函数定义为静态化,并通过static fn() => self::$message创建了一个闭包。该闭包能够访问类内部的私有静态变量$message。在testCallback()方法中,我们调用了该闭包,并输出了结果。

请注意,由于我们使用了静态化的匿名函数,所以无需依赖于对象进行绑定,但仍然可以访问类的成员变量



本文地址:https://www.phpfw.com/php8zhongdeniminghanshu.html
码字不易,打个赏呗
杨泽业感谢你的支持!

猜你喜欢

PHP8的静态变量和方法-PHP8知识详解

导读:我们在上一课程讲到了public、private、protected这3个关键字,今天我们来讲解static关键字,明天再讲解final关键字。 如果不想通过创建对象来调用变量或方法,则可以将该变量或方法创建为静态变量或方法,也就是在变量或方法的前面加上static关键词。

2023-09-28  分类:PHP8教程  浏览:1106次


PHP8中 伪变量“$this&gt;”和操作符“::”的使用-PHP8知识详解

导读:对象不仅可以调用自己的变量和方法,也可以调用类中的变量和方法。PHP8通过伪变量“$this>”和操作符“::”来实现这些功能。

2023-09-22  分类:PHP8教程  浏览:879次


PHP8的类与对象的基本操作之成员变量-PHP8知识详解

导读:成员变量是指在类中定义的变量。在类中可以声明多个变量,所以对象中可以存在多个成员变量,每个变量将存储不同的对象属性信息。

2023-09-19  分类:PHP8教程  浏览:789次


PHP8内置函数中的变量函数-PHP8知识详解

导读:今天学习的变量函数中,着重讲解了5个,分别是:检测变量是否为空的函数empty()、判断变量是否定义过的函数isset()、销毁指定的变量的函数unset()、获取变量的类型的函数gettype()、检查变量是否为数字或数字字符串的函数is_numeric()。

2023-08-29  分类:PHP8教程  浏览:507次


PHP8的匿名函数-PHP8知识详解

导读:PHP8引入了匿名函数(AnonymousFunctions),它是一种创建短生命周期的函数,不需要命名,并且可以在其作用域内直接使用。以下是在PHP8中使用匿名函数的知识要点。

2023-08-26  分类:PHP8教程  浏览:489次


变量函数及销毁函数中的变量-PHP8知识详解

导读:今天分享PHP8知识详解中的变量函数及销毁函数中的变量,以及相应的示例代码。

2023-08-25  分类:PHP8教程  浏览:517次


PHP8的变量-PHP8知识详解

导读:昨天我们讲解了PHP8的常量,今天讲解PHP8的变量。常量有定义常量和预定义常量,变量呢?那就没有定义变量了,那叫给变量赋值,但是还是有预定义变量的。下面就给大家讲解什么是变量、变量赋值及使用及预定义变量。

2023-08-01  分类:PHP8教程  浏览:514次


给PHP8和MySQL8添加到环境变量-ThinkPHP8知识详解

导读:在phpenv安装的时候,环境变量默认的PHP版本是7.4的,MySQL的版本是5.7的,要想使用thinkphp8来开发,就必须修改环境变量,本文就详细讲解了如果修改PHP和MySQL的环境变量。

2023-07-26  分类:ThinkPHP8教程  浏览:672次