三元运算符 - 意外行为

时间:2016-10-23 18:32:38

标签: php

我有一个Product类,它按产品名称检索数据库数据。 URL如下所示:

/products/product-name

我的类工作正常,并在执行此方法函数时检索产品数据:

$library->get('Router')->map('GET|POST', '/products/[*:product]', function($prod) use ($library){
    require_once(_DIR_ . 'lib/Product.php');
    $p = new Product($prod);
    $state = $p->prepare();
    require_once(_DIR_ . $state ? "views/product.php" : "views/404.php");
});

仅当$state为false时,所需文件是product.php文件而不是404.php文件。

我调试了这个,当没有产品时$state是假的,所以我的方法返回正确的bool,只是,三元运算符似乎每次都运行TRUE。

如果我将表达式更改为:

require_once(_DIR_ . $state === TRUE ? "views/product.php" : "views/404.php");

它运作正常,有人可以解释为什么会这样吗?如果我这样做:

$example = false;
echo ($example) ? 'yes' : 'no';

它有效,那为什么它会这样呢?

此外,

require_once(_DIR_ . $p->prepare() === TRUE ? "views/product.php" : "views/404.php");

不起作用,每次都运行错误......

3 个答案:

答案 0 :(得分:3)

由于.对三元运算符有precedence,因此您需要使用括号:

require_once(_DIR_ . ($state ? "views/product.php" : "views/404.php"));

答案 1 :(得分:2)

在第一个require_once(_DIR_ . $state ? "views/product.php" : "views/404.php");中,您不会评估条件,因此三元组不会返回正确的值

在第二个

require_once(_DIR_ . $state === TRUE ? "views/product.php" : "views/404.php");

您清楚地测试了有效条件,三元运算符可以正常工作

 _DIR_ . $state 

不是条件是断言

答案 2 :(得分:2)

  

仅当$ state为false时,所需文件为product.php   文件不是404.php文件。

但您不仅仅测试$state,而是在测试_DIR_$state串联的结果。

由于_DIR_将始终返回真值,因此集合结果永远不会为假。

当然,这不是你的意图;正如@trincot所指出的,_DIR_引用是require路径的一部分,而不是条件。所以用括号来区分这两者:

require_once(_DIR_.($state ? "views/product.php" : "views/404.php"));