从closure返回一个值到main方法

时间:2017-03-13 13:27:49

标签: php closures

我有一个关闭如下:

public function create(){
   DB::transaction(function(){
       return 'function called'
   });

我怎样才能返回"函数调用"来自create

2 个答案:

答案 0 :(得分:0)

您可以将此值指定给main方法的变量:

public function create(){
  $var = null;
  DB::transaction(function() use (& $var){
     $var= 'function called';
     return $var;
  });
  return $var;
}

答案 1 :(得分:0)

这取决于闭包的实现,

采用这个简单的例子:

function transaction($inReturnable, $returnable)
{
    $inReturnable();

    return $returnable();
}

$value = transaction(function() {
    return 'hello!';
}, function() {
    return 'yello!';
});

echo $value;
// Output: yello!

那么,这可能有用吗?

- 有时候你想让你的对象的客户端用户有权使用你的一些对象方法或属性而不会对你的对象上下文产生任何影响,你需要你的方法返回别的东西,同时你需要让用户有权在你的对象/方法中做一些事情,这可以说是一种依赖注入。

function transaction($inReturnable, $returnable)
{
    $privateVariable = 'Hello';
    $inReturnable($privateVariable);

    return $returnable();
}

$value = transaction(function($privateVariable) {
    echo $privateVariable . "\n";
}, function() {
    echo $privateVariable; // Notice: Undefined variable: privateVariable
    return 'yello!';
});

echo $value;
// Output: Hello 
Notice: Undefined variable: privateVariable
yello!

这种实现的实例,php

中array_map和array_walk内部函数的区别

array_walk

  

成功时返回TRUE,失败时返回FALSE。

array_map

  

应用后返回包含array1的所有元素的数组   每个回调函数。

它的类型:以下只是一个伪代码

// imagined implementation of array_map
array function array_map(callable $callback, array $array)
{
    return $callback if true;
}

// imagined implementation of array_walk
array function array_walk(array $array, callable $callback)
{
    return true if true;
}

例如:

$array = [1,2,3];

$map = array_map(function($value) {return $value * 3;}, $array);

print_r($map);

$walk = array_walk($array, function($value, $key) {return $value * 3;});

// will return true
print_r($walk);

array_walk($array, function($value, $key) use (&$array) {return $array[$key] = $value * 3;});

print_r($array);

这将输出:

Array ( [0] => 3 [1] => 6 [2] => 9 )
1
Array ( [0] => 3 [1] => 6 [2] => 9 )

对于您的示例:要从回调内部获取值,您可以通过引用将变量传递给回调,然后从闭包内部编辑它的值,然后根据需要在闭包外使用此变量,如下所示:

DB::transaction(function() use (&$return) {
    $return = 'some value!';
});
echo $return;

结论: -

这取决于函数/方法的实现。

相关问题