【问题标题】:Can I store a logical comparison in a string?我可以将逻辑比较存储在字符串中吗?
【发布时间】:2013-01-24 01:22:38
【问题描述】:

我正在尝试模块化一个冗长的if..else 函数。

$condition = "$a < $b";
if($condition)
{
    $c++;
}

有没有办法将文字字符串翻译成逻辑表达式?

【问题讨论】:

  • 可以使用eval 执行此操作,但标准方法是定义一堆函数...
  • 也许你应该解释一下,“模块化”到底是什么意思。
  • 请显示您冗长的 if..else 块(无效)。我几乎可以肯定,解决方案不是“模块化”。
  • 冗长的 if else 块通常表明您违反了一些干净编码的原则。
  • 因此需要模块化..

标签: php if-statement conditional modularity modularization


【解决方案1】:

我正在尝试模块化一个冗长的 if..else 函数。

您不需要为此将条件放在字符串中,只需存储布尔值 truefalse

$condition = ($a < $b);
if($condition)
{
    $c++;
}

$a 和 $b 的值可能会在 $condition 的定义和它的用法之间发生变化

一种解决方案是闭包(假设定义和使用发生在同一范围内):

$condition = function() use (&$a, &$b) {
    return $a < $b;
}
$a = 1;
$b = 2;
if ($condition()) {
    echo 'a is less than b';
}

但如果你不知道你想要完成什么,我不知道这对你是否有意义。

【讨论】:

  • $a 和 $b 的值可能会在 $condition 的定义和它的用法之间发生变化。
  • 如果你删除了闭包上面的部分,那将是最好的答案(它已经是什么了:))
  • 我不会删除它,以便为未来的读者留下更概括的答案。选择你需要的;)
  • 你会很高兴听到你错了:) 否则我的第一个解决方案会很好。你注意到 use 子句中的引用 (&amp;) 了吗?
【解决方案2】:

如果您知道足以确定结果的变量,请使用 lambda

$f = function ($a, $b) { return $a < $b; }

if ($f($x, $y)){}

【讨论】:

  • +1。尽管您在这里不需要 lambda,但只需一个普通的旧函数声明也可以:)
【解决方案3】:

您可以使用eval 执行此操作。不过,不知道您为什么不立即评估条件。

【讨论】:

  • eval 永远不是问题的解决方案。我们应该避免使用它。
【解决方案4】:
<?php
     $a=0;
     $b=1;
    function resultofcondition()
    {
        global $a,$b;
        return $a<$b;
    }
    if(resultofcondition()){
        echo " You are dumb,";
    }else{
        echo " I am dumb,"; 
    }
    $a=1;
    $b=0;
    if(resultofcondition()){
        echo " You were correct.";
    }else{
        echo " in your face.";
    }
?>

确实感谢您将其注释掉,缺少 GLOBAL 参数,对于那些投反对票的人,该代码会输出什么? ¬_¬ w/e 玩得开心xD

【讨论】:

  • 这在 PHP 中不起作用,$a$b 在函数范围内不可用。
  • @RicardoOrtegaMagaña 他们肯定不是,除非你使用global $a, $b;
  • 这最后一条评论没有为答案添加任何有用的东西。
猜你喜欢
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多