在PHP中重构闭包/匿名函数

在PHP中重构闭包/匿名函数,php,closures,anonymous-function,php-closures,Php,Closures,Anonymous Function,Php Closures,是否可以用如下代码重构匿名函数: 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 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 router.php
您肯定应该打开错误报告:

注意:未定义变量:app in。。。第6行

移动直线时:

$app = array('a', 'b', 'c');
在脚本开始时,您将得到一个结果

编辑

您可以通过以下方式使用$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);
编辑2

类的示例代码

<?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

这是一种方法,但是您应该在声明$app之后声明使用$app的匿名函数,否则您将不向发送任何内容it@RoyalBg这是可行的,但这是否意味着我必须在声明$app后要求函数文件?如果$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);
<?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