2011-07-28 35 views
-2

我正在用Drupal的PHP自动测试工作。这是一个有两种我关心的方法的类:pass()fail()。每个人在结果页面上产生一个单独的行,指示特定操作是否通过或失败,例如,三元或类似的选择功能?

if ($value == "expected_value") { 
    $this->pass("Looking for expected value"); 
} else { 
    $this->fail("Looking for expected value"); 
} 

我注意到上面的内容是它有点冗长。我想做类似三元赋值的事情,而不是在我决定调用哪个函数的地方。喜欢的东西:

$function = ($value == "expected_value") ? "pass" : "fail" ; 
$this->$function("Looking for expected value."); 

这是最简洁,优雅的方式,我可以词组这种逻辑?我试过

$this->(($value == "expected_value") ? "pass" : "fail")("Looking for expected value."); 

但是我得到了一个解析错误。是否有办法将它归结为一行,如三元赋值?

编辑我发现的冗长不是if-else结构,但我重复两次相同的消息。在我看来,应该有一种表达方式,我只在这里宣布信息。当然,我可以把它放在一个变量中,但是这占用了额外的空间,我也通过了两次。

下面是构建我的问题的另一种方式:是否有一种方法可以定义此逻辑,但只能一次性表示Looking for expected value

+2

看来你正试图通过语法来简化,而不是通过设计。不要试图压缩你的代码,而要创建一个简单的类来验证数据并自动调用通过/失败。尝试从应用程序特定代码中获取'通用'代码。 –

+1

我同意。通过一切手段,使用KingCrunch的答案中显示的三元组,但是这样做是为了替换函数名称本身?这样下去只有疯狂的谎言。如果你在两年内打开这个网站并试图弄清楚到底发生了什么,那么好处(我向你保证你完全被感知,而不是真实的)不值一秒钟的困惑。 – Andrew

回答

1

我认为你原来的代码是最好的可读性,但如果你想要的东西更短的(尽管不一定优雅),你可以这样做:

call_user_func(
    array($this,$value == "expected_value"?'pass':'fail'), 
    "Looking for expected value." 
) 
+0

我喜欢这个答案,因为它只定义了消息一次:) – user151841

+0

是的,这比将消息放入变量中更容易。 '' – webbiedave

+0

请注意,您可以为变量分配函数(http://php.net/manual/en/functions.variable-functions.php)。我有别名的GD图像函数,但我从来没有尝试过任何使用'$ this->''$ foo = $ this-> bar('baz');'。这个想法是分配通过或失败的功能,而不是在测试中调用它,然后调用变量 – horatio

7

我会使用通常的if-elseif -statement,因为它是最明显的,可读的(也许它只是我)它不是“详细”,它只是一个if-elseif-陈述。

然而

($value == $expectedValue) ? $this->pass() : $this->fail(); 
+0

我喜欢它,但我仍然必须输入相同的通过/失败消息两次,或者将其声明在前一行的变量中。 – user151841

+1

我感觉的冗长不是'if-elseif',而是我重复两次相同的消息字符串。在我看来,应该有办法只写一次参数。 – user151841

+1

不管通过还是失败,为什么消息都是相同的? – barfoon