-
Понимание закрытия PHP через несколько каштанов
- 1. Каштан 1 используется для обратного вызова
- 2. Каштан 2 используется для присвоения переменной
- 3. Каштан 3 наследует переменные от родительской области
-
В-четвертых, предпосылки каштана 4, простое понимание
call_user_func_array()
а такжеcall_user_func()
метод - 5. Каштан 4 привязывает замыкание к указанному объекту
- 6. Ссылки
Если у вас есть, пожалуйстадобавить маленькую звездочку, если выигрыша нет, то можнобыть против нет помощи отчетСанлиан
- образец кода
- Адрес этой статьи
- Мои возможности ограничены, если я столкнусь с чем-то не так, я надеюсь указать на исправления, спасибо
- Все выходы каштана используют
symfony/var-dumpe
украшенный
Анонимные функции, также называемые замыканиями, позволяют временно создавать функцию без указанного имени. Чаще всего используется как значение параметра обратного вызова. Конечно, есть и другие приложения.
В настоящее время анонимные функции реализуются через класс Closure.
1. Каштан 1 используется для обратного вызова
$rs = preg_replace_callback('/-([a-z])/', function ($match) {
return strtoupper($match[1]);
}, 'hello-world');
dump($rs); // "helloWorld"
2. Каштан 2 используется для присвоения переменной
$greet = function ($name) {
dump($name);
};
dump($greet instanceof Closure); // true
$greet('PHP'); // "PHP"
3. Каштан 3 наследует переменные от родительской области
$message = 'hello';
$example = function () use ($message) {
dump($message);
};
dump($example instanceof Closure); // true
$example(); // "hello"
В-четвертых, предпосылки каштана 4, простое пониманиеcall_user_func_array()
а такжеcall_user_func()
метод
1. call_user_func — вызвать первый параметр как callback-функцию
function call_user_func (parameter) {}
Этот метод получает несколько параметров, первый из которых — функция обратного вызова, которую можно普通函数
,так же может быть闭包函数
,Назад多个参数
используются как обратные вызовы функций
$rs = call_user_func(function (...$params) {
return func_get_args();
}, 1, 2, 3);
dump($rs); // [1,2,3]
2. call_user_func_array — вызов функции обратного вызова с параметром массива в качестве параметра функции обратного вызова
function call_user_func_array (param_arr) {}
Этот метод получает 2 параметра, первый — это функция обратного вызова, которую можно普通函数
,так же может быть闭包函数
,Назад数组参数
используются как обратные вызовы функций
$rs = call_user_func_array(function (array $params) {
return func_get_args();
}, [1, 2, 3]);
dump($rs); // [1,2,3]
5. Каштан 4 привязывает замыкание к указанному объекту
Мнение арендодателя - привязать метод к указанному классу, чтобы метод также мог использовать свойства и методы класса, что очень подходит для сотрудничества.__call()
магический метод иcall_user_func_array
метод, используемый вместе
1. Closure::bindTo — Копирует текущий объект замыкания, связывая указанный объект $this и область действия класса.
function bindTo(newscope = 'static') { }
<?php
namespace PHP\Demo\Closure;
class ClosureBindTo
{
public function __call($name, $arguments)
{
if (count($arguments) > 1 && $arguments[0] instanceof \Closure) {
return call_user_func_array($arguments[0]->bindTo($this), array_slice($arguments, 1));
}
throw new \InvalidArgumentException("没有这个方法");
}
}
// 测试
public function testClosureBindTo()
{
$obj = new ClosureBindTo();
$this->assertEquals(2, $obj->add(function (array $params) {
return ++$params[0];
}, [1]));
// 测试同一个实例
$newObj = $obj->test(function (array $params){
return $this;
}, [1]);
$this->assertTrue($newObj instanceof $obj);
}
2. Closure::bind — Копирует замыкание, привязывая указанный объект $this к области видимости класса.
static function bind(Closure newthis, $newscope = 'static') { }
Функция привязки является статическим представлением bindTo.
<?php
namespace PHP\Demo\Closure;
class ClosureBind
{
private $methods = [];
public function addMethod(string $name, \Closure $callback)
{
if (!is_callable($callback)) {
throw new \InvalidArgumentException("第二个参数有误");
}
$this->methods[$name] = \Closure::bind($callback, $this, get_class());
}
public function __call(string $name, array $arguments)
{
if (isset($this->methods[$name])) {
return call_user_func_array($this->methods[$name], $arguments);
}
throw new \RuntimeException("不存在方法[{$name}]");
}
}
// 测试
public function testClosureBind()
{
$obj = new ClosureBind();
$obj->addMethod('add', function (array $params) {
return ++$params[0];
});
$this->assertEquals(2, $obj->add([1]));
// 测试同一个实例
$obj->addMethod('test', function (array $params) {
return $this;
});
$this->assertTrue($obj->test([1]) instanceof $obj);
}