php匿名函数

PHP匿名函数和闭包使用的句法与普通函数相同,但匿名函和闭包数其实是伪装成函数的对象.

匿名函数:就是没有名称的函数.匿名函数可以赋值给变量,对象传递.不过匿名函数仍是函数,因此可以调用,还可以传入参数.匿名函数特别适合作为函数或方法的回调.

闭包:是指在创建时封装周围状态的函数.即使闭包所在的环境不存在了,闭包中封装的状态依然存在.

注意:理论上讲,闭包和匿名函数是不同的概念. 不过,PHP将其视作相同的概念.

匿名函数的语法:

1 $func = function(){
2     
3 };//带结束符

示例demo:

1 $func = function($param){
2     echo($param);
3 };
4 $func('hello world');

 

实现闭包?

将匿名函数在普通函数中当做参数传入,也可以被返回.这就实现了一个简单的闭包.

示例demo:

//(示例1):函数里定义一个匿名函数,并且调用它
function content(){
    $func = function($param){
        echo $param;
    };
    $func('hello world');
}
content();

 

 

 

//(示例2):函数中把匿名函数返回,返回后调用它
function content(){
    return $func = function($param){
        echo $param;
    };
}
$data = content();
$data('hello world');

 

 

 //(示例3):把匿名函数当做参数传递,并且调用它
function callFunc($func){
    $func('hello world');
}
$data = function($param){
    echo $param;
};
callFunc($data);die;

//直接将匿名函数进行传递
callFunc(function($param){
    echo $param;
});

 

闭包使用use关键字   use:连接闭包和外界变量

使用语法:

1 $func = function() use(){
2  
3 };

示例demo:

//将外层变量传进内层匿名函数,并且调用
function func($param){
    return function() use($param){
        echo $param;
    };
}
$content = func('hello world');
$content();

 

closure类中的bind和bindTo
Closure类
方法说明:

Closure::__construct — 用于禁止实例化的构造函数
Closure::bind — 复制一个闭包,绑定指定的$this对象和类作用域
Closure::bindTo — 复制当前闭包对象,绑定指定的$this对象和类作用域

 

bindTo():

参数1 :传类进去,public属性和方法.只传第1个参数即可
参数2 :传类进去,private或protected属性和方法.就要传第2个参数.两种写法:(1)传类名,直接字符串 (2)传类当前对象[第一个参数相同的$obj],bindTo()会自动获取类名

示例demo:

<?php
class User{ 
    private $name ; 
    function __construct ( $name ){ 
          $this ->name = $name ; 
    } 

$func = function () { 
    return "Hello " . $this ->name; 
}; 

$obj = new User('admin'); 

$dataUser = $func->bindTo($obj,'User'); 
echo $dataUser();//Hello admin

$dataObj = $func->bindTo($obj,$obj); 
echo $dataObj();die;//Hello admin

 

bind():

参数1($closure)  :表示闭包函数
参数2($newthis)  :相当于在函数内/外调用的区别,传类的实例表示在内部调用,NULL相当于在外部调用
参数3($newscope) :相当于类和实例调用的区别,函数的作用域,传类表示静态调用方式,内部可以“类名::属性”的方式使用;实例表示实例调用方式,内部可以“->”

示例demo:

<?php
/** 
 * 复制一个闭包,绑定指定的$this对象和类作用域.
 */
class Animal {
    private static $cat = "cat";
    private $dog = "dog";
    public $pig = "pig";
}

/* 
 * 获取Animal类静态私有成员属性
 */
$cat = static function() {
    return Animal::$cat;
};

/* 
 * 获取Animal实例私有成员属性
 */
$dog = function() {
    return $this->dog;
};

/* 
 * 获取Animal实例公有成员属性
 */
$pig = function() {
    return $this->pig;
};

$bindCat = Closure::bind($cat, null, new Animal());// 给闭包绑定了Animal实例的作用域,但未给闭包绑定$this对象
$bindDog = Closure::bind($dog, new Animal(), 'Animal');// 给闭包绑定了Animal类的作用域,同时将Animal实例对象作为$this对象绑定给闭包
$bindPig = Closure::bind($pig, new Animal());// 将Animal实例对象作为$this对象绑定给闭包,保留闭包原有作用域
echo $bindCat(),'<br>';// 根据绑定规则,允许闭包通过作用域限定操作符获取Animal类静态私有成员属性
echo $bindDog(),'<br>';// 根据绑定规则,允许闭包通过绑定的$this对象(Animal实例对象)获取Animal实例私有成员属性
echo $bindPig(),'<br>';// 根据绑定规则,允许闭包通过绑定的$this对象获取Animal实例公有成员属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值