我有一个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");
不起作用,每次都运行错误......
答案 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"));