2011-05-09 72 views
2

我正在写一个函数,用于限制太长的字符串。我想避免重复的代码,所以我认为将几乎整个函数“逻辑”放入返回表达式中比在每个开关的情况下检查条件要好。但让我们看看代码:如何使用lambda函数作为三元运算符的条件

function test($mode, $string) { 
    $x = strlen("..."); 
    $overThr = function($x, $y){strlen($string) >= $y + $x + 1;}; 

    switch ($mode) { 
     case 'artist_week': 
      $y = 29; 
      break; 
     case 'songs_week': 
      $y = 31; 
      break; 
    } 
    return (substr($string, 0, $overThr($x, $y) ? $y : strlen($string))) . ($overThr($x, $y) ? "..." : ""); 
} 

正如您所看到的,我希望使用$ overThr作为三元运算符中的灵活条件。但我不明白为什么每次在$ returnThr中执行$ overThr都会返回false。

$a = test('songs_week', 'razdwatrzyczterypiecszescsiedemrazdwatrzyczterypiecszescsiedem'); 
echo $a; 
//razdwatrzyczterypiecszescsiedemrazdwatrzyczterypiecszescsiedem 

有人知道吗? :)

+4

题外话,但可维护性的缘故,你应该打破return语句成多行。 (当然,你一眼就明白了,但在六个月内......) – 2011-05-09 18:19:05

+0

是的,这也是很好的提示。我想这也会对那些回答这个问题的人有所帮助:) – 2011-05-09 18:36:42

回答

2

$string不封闭内定义的,你忘了return声明

function ($x, $y) use ($string) { 
    return strlen($string) >= $y + $x + 1; 
}; 
+0

用于添加'return'的+1。我删除了我的答案。 – webbiedave 2011-05-09 18:28:05

+0

感谢您的提示:) – KingCrunch 2011-05-09 18:28:57

+0

没问题。 --- – webbiedave 2011-05-09 18:29:36

1

您在lambda中使用$string,但未将其作为参数传入或在lambda中将其定义为global,因此它为空/空。

+2

请不要推荐'global'。 – KingCrunch 2011-05-09 18:28:21