Рефакторинг замыканий / анонимных функций в PHP
Можно ли реорганизовать анонимную функцию из кода следующим образом:
function foo($path, $callback) {
$callback();
}
$app = array('a', 'b', 'c');
foo('vehicle/:id', function() use ($app) {
echo $app[0];
});
Я попробовал это, но ничего не повторилось:
function foo($path, $callback) {
$callback();
}
$vehicleCallback = function() use ($app) {
echo $app[0];
};
$app = array('a', 'b', 'c');
foo('vehicle/:id', $vehicleCallback);
Другие варианты дали мне синтаксические ошибки. Я ищу, чтобы переместить функции в отдельный файл, если это имеет значение.
Это моя конечная цель
callbacks.php
$cb1 = function () use ($app) {
// things
};
$cb2 = function () use ($app) {
// things
};
// ...more callbacks
router.php
require 'callbacks.php';
$app = new \Foo();
// code that might possibly manipulate $app
$app->bar('/some/relative/path/:param1', $cb1);
$app->bar('/another/relative/path', $cb2);
// possibly more code that mutates $app and then more callbacks
1 ответ
Решение
Вы обязательно должны включить error_reporting:
Примечание: неопределенная переменная: приложение в... в строке 6
Когда вы перемещаете линию:
$app = array('a', 'b', 'c');
в начале вашего скрипта вы получите результат a
РЕДАКТИРОВАТЬ
Ты можешь использовать $app
сюда:
<?php
function foo($path, $callback, $app) {
$callback($app);
};
$vehicleCallback = function($app) {
echo $app[0];
};
$app = array('a', 'b', 'c');
foo('vehicle/:id', $vehicleCallback, $app);
EDIT2
Пример кода для вашего класса
<?php
$cb1 = function ($app, $path) {
// things
$app->display('cb1 '.$path.'<br />');
};
$cb2 = function ($app, $path) {
// things
$app->display('cb2 '.$path);
};
class Foo {
public function display ($string) {
echo strtoupper($string);
}
public function bar ($path, $closure) {
$closure($this, $path);
}
}
$app = new \Foo();
// code that might possibly manipulate $app
$app->bar('/some/relative/path/:param1', $cb1);
$app->bar('/another/relative/path', $cb2);
// possibly more code that mutates $app and then more callbacks