php匿名函数不匿名,PHP匿名函数与匿名类详解

匿名函数

引用官方的一句话:匿名函数(Anonymous functions),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。

但是在PHP内,由于匿名函数是通过闭包类实现的( Anonymous functions are implemented using the Closure class),因此多数人混淆了闭包技术和匿名函数;实际上,闭包是一项「技术」或者说「功能」,能够捕获并存储当前当前上下文状态,以供后续使用。

匿名函数就只是一个「函数」,一个没有名字的函数而已。在实际应用中,匿名函数通常伴随着使用闭包技术;但闭包并不一定只能用在匿名函数内。在其他语言内是完全不同的两个概念的(记得区分闭包和匿名函数,匿名函数==闭包)。

匿名函数的形式

// 简单的匿名函数

$greet = function($name)

{

printf("Hello %s\r\n", $name);

};

$greet('ChenDasheng');

$greet('World');

//继承外部变量$message的简单的匿名函数

$message = 'Hello';

$example = function () use ($message) { //继承$message = 'Hello';

var_dump($message);

};

echo $example();

常见的几种匿名函数用法(有很多中用法,列举比较常见的)

//匿名函数当作参数传递(Laravel中where闭包就是这种)

function myFunction($anonymousFunc){

$anonymousFunc("Chen Dasheng");

}

myFunction(function($username){

echo $username;

});

//在普通函数中返回匿名函数(比较常用)

function closureFunction(){

$username = 'ChenDasheng';

$anonymousFunc = function() use($username){

echo $username;

};

return $anonymousFunc;// 函数返回匿名函数

}

$func = closureFunction();

$func(); //然后调用$func()

//返回匿名函数并给匿名函数传参

function closureFunc(){

$username = 'ChenDasheng';

$anonymousFunc = function($lover,$skill) use($username){

echo $username.$lover.$skill;

};

return $anonymousFunc;

}

$func = closureFunc();

$func("喜欢","写代码");//ChenDasheng喜欢写代码

PHP预定义接口 Closure类

Closure {

// 禁止实例化

private __construct(void){}

//复制一个闭包,绑定指定的 $newThis 对象和类的作用域

public static bind( Closure $closure, object $newthis[, mixed $newscope = 'static'] ){}

//复制当前闭包对象, 绑定指定的 $newThis 对象和类的作用域

public bindTo( object $newthis[, mixed $newscope = 'static'] ){}

}

Closure::bind 与 Closure::tobind (就是省略了一个参数)

class Person {

private static $name = 'ChenDasheng';

private $age = 25;

public $sex='男';

}

$cl1 = static function() {

return Person::$name;

};

$cl2 = function() {

return $this->age;

};

$cl3 = function() {

return $this->sex;

};

/**

* Closure class a method

* 复制一个闭包,绑定指定的 $newThis对象和类的作用域

* @param Closure $closure 必填 表示闭包函数

* @param object $newThis 必填 闭包中 $this 所指的对象 传入类名代表当前类,静态方法不能传值

* @param mixed $newscope 可选 我们闭包中需要操作属性等所属类的类型名 默认是static,static只能取公共值

* @return \Closure

*/

//output:ChenDasheng

$bcl1 = Closure::bind($cl1, null, 'Person');

//output:PHP Fatal error

$bcl1 = Closure::bind($cl1, new Person(), 'Person');

//output:25

$bcl2 = Closure::bind($cl2, new Person(), 'Person');

//output:PHP Fatal error

$bcl2 = Closure::bind($cl2, null, 'Person');

//output:PHP Fatal error

$bcl2 = Closure::bind($cl2, new Person());

//output:男

$bcl3 = Closure::bind($cl3, new Person());

匿名类

PHP 7 开始支持匿名类。 匿名类很有用,可以创建一次性的简单对象

// PHP 7 之前的代码

class Logger

{

public function log($msg)

{

echo $msg;

}

}

$util->setLogger(new Logger());

// 使用了 PHP 7+ 后的代码

$util->setLogger(new class {

public function log($msg)

{

echo $msg;

}

});

可以传递参数到匿名类的构造器,也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用 trait:

class SomeClass {}

interface SomeInterface {}

trait SomeTrait {}

var_dump(new class(10) extends SomeClass implements SomeInterface {

private $num;

public function __construct($num)

{

$this->num = $num;

}

use SomeTrait;

});

匿名类被嵌套进普通 Class 后,不能访问这个外部类(Outer class)的 private(私有)、protected(受保护)方法或者属性。为了访问外部类(Outer class)protected 属性或方法,匿名类可以 extend(扩展)此外部类。为了使用外部类(Outer class)的 private 属性,必须通过构造器传进来

class Outer

{

private $prop = 1;

protected $prop2 = 2;

protected function func1()

{

return 3;

}

public function func2()

{

return new class($this->prop) extends Outer {

private $prop3;

public function __construct($prop)

{

$this->prop3 = $prop;

}

public function func3()

{

return $this->prop2 + $this->prop3 + $this->func1();

}

};

}

}

echo (new Outer)->func2()->func3(); //output:6

参考

欢迎各位大佬补充;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值