【问题标题】:Is it ok to use closures for the sake of encapsulation?为了封装而使用闭包可以吗?
【发布时间】:2017-05-23 07:44:20
【问题描述】:

我使用的是这样的代码:

$a = [];
$a['a'] = 1;
$text1 = [];
foreach ($b as $item)
{
    $text1[] = $item['1'];
}
$a['text1'] = implode(',', $text1);

$text2 = [];
foreach ($b as $item)
{
    $text2[] = $item['2'];
}
$a['text2'] = implode(',', $text2);

我的同事这样改写它:

$a = [];
$a['a'] = 1;
$a['text1'] = call_user_func(function() use ($b) {
    $text1 = [];
    foreach ($b as $item)
    {
        $text1[] = $item['1'];
    }
    return implode(',', $text1);
}();

$a['text2'] = call_user_func(function() use ($b) {
    $text2 = [];
    foreach ($b as $item)
    {
        $text2[] = $item['2'];
    }
    return implode(',', $text2);
}();

他的原因:它增加了封装性,在我的第一个示例中,除非我取消设置它们,否则会有“漫游”变量($text1$text2)。

【问题讨论】:

  • 这和 Clojure 有什么关系。那个标签是closure 的错字吗?
  • $a['text1'] = implode(',', array_column($b, '1')); 呢?
  • call_user_func 的语法错误。应该是call_user_func(function(){...});你最后多了一个(
  • 简而言之,你的同事说的有道理。但是,它们的更改只是朝着正确封装对象迈出的一小步,该对象应同时包含 $b 和刚刚创建的闭包(作为方法)。
  • 在第二段代码中call_user_func() 的使用非常错误,尤其是因为它以几乎相同的方式重复了第二次。一次使用普通函数要好得多。

标签: php closures


【解决方案1】:

是的,我同意你同事的观点——使用闭包来封装代码是有意义的。

但是,您所拥有的所有内容都可以简化为:

<?php

$a = [
    'a' => 1,
    'text1' => implode(',', array_column($b, '1')),
    'text2' => implode(',', array_column($b, '2')),
];

参考见:

【讨论】:

  • “使用闭包来封装代码是有意义的”——这样做有什么意义?这里只是为了解决 php 中缺少块作用域的问题,仅此而已。
  • @zerkms 您可以将变量的范围限制为闭包,而不是分散使用闭包的范围。那是同事提出的观点,对吧?我同意。
  • 它的实际原因是......?它解决了什么问题?我看到代码变得不那么可读,消耗更多内存并且速度变慢。
  • @zerkms 你是指我的代码还是原贴的代码?
  • @zerkms 哈,谢谢!说实话,不确定。同意您的观点,原始发帖人同事的代码示例可读性较差,这就是为什么我建议应用更简单的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2016-12-24
  • 2012-02-02
相关资源
最近更新 更多