我现在有这个使用cookie值,否则使用默认值:
$default_carat_min = "0.25";
if($_COOKIE["diamond-search_caratMin"])
{
$default_carat_min = $_COOKIE["diamond-search_caratMin"];
}
我将不得不用很多变量来做这件事,而且它会变得非常混乱/丑陋。所以我试图想出一个更清晰的写作方式。
我试过了:
$default_carat_min = $_COOKIE["diamond-search_caratMin"] | "0.25";
哪个不起作用。
我可以这样做:
$default_carat_min = $_COOKIE["diamond-search_caratMin"] ? $_COOKIE["diamond-search_caratMin"] : "0.25";
但我不喜欢我必须重复$_COOKIE
两次。我想知道是否有办法写出类似我的第二个例子?
答案 0 :(得分:20)
PHP 5.3为ternary operator添加了一个简短形式:
$default_carat_min = $_COOKIE["diamond-search_caratMin"] ?: "0.25";
如果左侧为真,则评估左侧,否则评估为右侧。
然而,在5.3之前,你必须使用长格式。
答案 1 :(得分:4)
您可以使用以下功能:
function set_default(&$var, $default) {
return isset($var) ? $var : $default;
}
$default_carat_min = set_default($_COOKIE["diamond-search_caratMin"], "0.25");
答案 2 :(得分:2)
我认为这个问题是主观的。我个人认为最好是冗长而且你的第一个表格没有任何问题,因为你的代码完全明显。
这并不像你可以使用的线数或尺寸限制。你真的通过节省一些击键来节省那么多吗?
如果确实存在问题,或许尝试减少首先使用的变量数量将是更好的解决方案
答案 3 :(得分:2)
我同意Cfreak的回答。我宁愿代码“显而易见”。
要添加到那个,虽然你不想为0.25
(或其他值)的每个实例搜索你的代码所以我建议你创建一个配置文件,如果你没有,并添加这个...
DEFINE( 'DEFAULT_CARAT_MIN', 0.25 );
// other defaults
然后包括配置文件和
if($_COOKIE["diamond-search_caratMin"])
{
$default_carat_min = $_COOKIE["diamond-search_caratMin"];
}
else {
$default_carat_min = DEFAULT_CARAT_MIN;
}
你也可以使用三元运算符
$default_carat_min = $_COOKIE["diamond-search_caratMin"] ? $_COOKIE["diamond-search_caratMin"] : DEFAULT_CARAT_MIN;
答案 4 :(得分:1)
为避免使用电子通知:
$default_carat_min = @$_COOKIE["diamond-search_caratMin"] ?: "0.25";
请注意使用@
来消除错误消息。
答案 5 :(得分:0)
这个问题包含一个提示,即必须检查相当多的变量以确保它们具有默认值,并且没有人提到这一点。这就是我现在要做的事情:
您可以先定义一个默认值数组,然后方便地循环。这个例子只检查$ _COOKIE全局:
$defaults = Array(
'diamond-search_caratMin' => "0.25"
,'diamond-search_caratMax' => "2.00"
);
foreach ($defaults as $dk => $dv) {
if (!isset($_COOKIE[$dk])) {
$_COOKIE[$dk] = $dv;
}
}
如果您计划为多个变量和不同类型设置默认值,可以使用以下代码:
$defaults = Array(
'_COOKIE' => Array(
'diamond-search_caratMin' => "0.25"
, 'diamond-search_caratMax' => "2.00"
)
, 'myOtherArray' => Array(
'value_1' => 10
, 'value_2' => 20
)
, 'myString' => 'Hello'
, 'myFloat' => 1.0
);
foreach ($defaults as $vk => $vv) {
if (is_array($vv)) {
if (!isset($$vk)) {
$$vk = Array();
}
foreach ($vv as $dk => $dv) {
if (!isset($$vk[$dk])) {
$$vk[$dk] = $dv;
}
}
} else {
if(!isset($$vk)) {
$$vk=$vv;
}
}
}
下一步是通过解析一些ini文件来生成$ defaults数组,这样您就可以轻松地以可读且易于编辑的方式集中默认值。我不打算在这里展示,因为我认为它超出了这里的要求。
希望有人喜欢这个....