原文:https://www.cnblogs.com/eleven24/p/7487923.html
1、只绑定$this对象.
2、只绑定类作用域.
3、同时绑定$this对象和类作用域.(文档的说法)
4、都不绑定.(这样一来只是纯粹的复制, 文档说法是使用cloning代替bind或bindTo)
第一种 只绑定$this对象
$closure
=
function
(
$name
,
$age
) {
$this
->name =
$name
;
$this
->age =
$age
;
};
class
Person {
public
$name
;
public
$age
;
public
function
say() {
echo
"My name is {$this->name}, I'm {$this->age} years old.\n"
;
}
}
$person
=
new
Person();
//把$closure中的$this绑定为$person
//这样在$bound_closure中设置name和age的时候实际上是设置$person的name和age
//也就是绑定了指定的$this对象($person)
$bound_closure
= Closure::bind(
$closure
,
$person
);
$bound_closure
(
'php'
, 100);
$person
->say();
第二种 只绑定类作用域.
$closure
=
function
(
$name
,
$age
) {
static
::
$name
=
$name
;
static
::
$age
=
$age
;
};
class
Person {
static
$name
;
static
$age
;
public
static
function
say()
{
echo
"My name is "
.
static
::
$name
.
", I'm "
.
static
::
$age
.
" years old.\n"
;
}
}
//把$closure中的static绑定为Person类
//这样在$bound_closure中设置name和age的时候实际上是设置Person的name和age
//也就是绑定了指定的static(Person)
$bound_closure
= Closure::bind(
$closure
, null, Person::
class
);
$bound_closure
(
'php'
, 100);
Person::say();
第三种 同时绑定$this对象和类作用域.(文档的说法)
$closure
=
function
(
$name
,
$age
,
$sex
) {
$this
->name =
$name
;
$this
->age =
$age
;
static
::
$sex
=
$sex
;
};
class
Person {
public
$name
;
public
$age
;
static
$sex
;
public
function
say()
{
echo
"My name is {$this->name}, I'm {$this->age} years old.\n"
;
echo
"Sex: "
.
static
::
$sex
.
".\n"
;
}
}
$person
=
new
Person();
//把$closure中的static绑定为Person类, $this绑定为$person对象
$bound_closure
= Closure::bind(
$closure
,
$person
, Person::
class
);
$bound_closure
(
'php'
, 100,
'female'
);
$person
->say();
4、都不绑定.(这样一来只是纯粹的复制, 文档说法是使用cloning代替bind或bindTo)
$closure
=
function
() {
echo
"bind nothing.\n"
;
};
//与$bound_closure = clone $closure;的效果一样
$bound_closure
= Closure::bind(
$closure
, null);
$bound_closure
();