【问题标题】:Refactoring closures/anonymous functions in PHP在 PHP 中重构闭包/匿名函数
【发布时间】:2014-09-12 23:48:44
【问题描述】:

是否可以用这样的代码重构匿名函数:

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

【问题讨论】:

  • 是这样,但是你应该在声明$app之后声明使用$app的匿名函数,否则你什么也不发送给它
  • @RoyalBg 这行得通,但这是否意味着我必须在声明 $app 之后需要函数文件?如果$app 发生变化怎么办?
  • 它应该比之前改变:)

标签: php closures anonymous-function php-closures


【解决方案1】:

你绝对应该打开error_reporting:

注意:未定义的变量:app in ... 第 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

【讨论】:

  • 我知道错误是什么。我在原始帖子中添加了一些信息,以阐明我的最终目标是什么。
猜你喜欢
  • 2011-05-08
  • 2014-09-11
  • 2011-06-22
  • 2017-01-11
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
相关资源
最近更新 更多