Php 优化代码问题,多个If-Else语句

Php 优化代码问题,多个If-Else语句,php,if-statement,Php,If Statement,我是一个相当糟糕的程序员,但我正在努力变得更好。我最近编写了一些有用的代码,万岁!但我觉得一定有更干净的方法。目标是: 如果GET变量存在,则将其用作cookie值。如果变量不存在,请使用默认值。如果Cookie已经存在,请使用该值而不是新值 if (!isset($_COOKIE['id'])) { if (!isset($_GET[id])) { $cookid="115"; } else { $cookid= $_GET["id"]; } setcooki

我是一个相当糟糕的程序员,但我正在努力变得更好。我最近编写了一些有用的代码,万岁!但我觉得一定有更干净的方法。目标是:

如果GET变量存在,则将其用作cookie值。如果变量不存在,请使用默认值。如果Cookie已经存在,请使用该值而不是新值

if (!isset($_COOKIE['id'])) {
  if (!isset($_GET[id])) {
    $cookid="115";
  } else {
    $cookid= $_GET["id"];
  } 
  setcookie("id", $cookid , time() + 31536000);
} else {
  $cookid= $_COOKIE['id'];
}

我是这样写的:

if(isset($_COOKIE['id'])) {
  $cookid = $_COOKIE['id'];
} else {
  $cookid = isset($_GET["id"]) ? $_GET["id"] : "115";

  setcookie("id", $cookid, time() + 31536000);
}
首先,根据一些惯例,您应该测试阳性情况(
isset(…)
),而不是阴性情况(
!isset()
)。我认为这有助于提高代码的可读性,所以我将其转换

其次,我使用了(
条件?expr1:expr2
)来消除if/else块,这是可以接受的,因为您只是使用if/else块来决定将两个值中的哪一个分配给变量。不过,使用三元运算符时应谨慎,因为如果过度使用,可能会降低代码的可读性

第三,我倾向于对一行if/else块使用大括号,但至少我认为,如果对
if
使用大括号,则应对
else
使用大括号

最后,请注意可读性:尽量与空白保持一致。第四行的
=
周围没有空格,但第六行和第十行后面有空格,但前面没有。为了可读性,在操作符的两边都有空格几乎总是更可取的


哦,
$\u GET[“id”]
是正确的<代码>$\u GET[id]不可用。如果您的错误报告级别足够高(并且您通常应该使用
错误报告(E_ALL);
进行开发,这样您就可以看到它们),它(正确地)会发出警告。

我会将其封装到一个易于重用的函数中:

<?php
/**
 * If GET variable exists use it as the cookie value.
 * If the Variable doesn't exist use a default value.
 * If the Cookie already exists use that value instead of a new one.
 * 
 * @param string $name name of cookie / get variable
 * @param string $default default value
 * @return string the value.
 */
function cookie_get_value($name, $default) {
    if (isset($_COOKIE[$name])) {
        $value = $_COOKIE[$name];
    } else {
        $value = isset($_GET[$name]) ? $_GET[$name] : $default;
        setcookie($name, $value , time() + 31536000);
    }
    return $value;
}

echo cookie_get_value('id', '115');

我相信您可以使用$\u REQUEST,因为它已经包含了$\u POST、$\u GET和$\u COOKIE

if (!isset($_REQUEST['id']))
{
   $cookid = '115';
   setcookie("id", $cookid , time() + 31536000); 
}
else
  $cookid = $_REQUEST['id'];    

您的代码看起来应该执行您希望它执行的操作?它的行为是否不符合预期?如果你在寻找一个更干净的方法,我想你已经有了一个非常简单的方法。当你有疑问时,使用“奥卡姆剃刀”,用简单的方法解决复杂的问题。祝你好运很高兴我问了这个问题,我以前从来没有听说过三元运算符,所以我学到了一些新的东西。约翰:我在我的答案上又增加了一些提示。看一看。希望对你有帮助,再看一遍。感谢所有的帮助,我真的很感谢指针。从5.3开始,PHP支持?:Elvis操作符。只要id不会计算为false,就可以执行$cookid=$\u GET[“id”]?:“115”;谢谢,mwhite,我不知道PHP5.3添加了这个。一个名为
cookie\u get\u value
的函数调用
setcookie()
?通过。当然,函数名只是一个猜测,其价值非常有限。只有最初的OP才能根据具体需要命名函数,他是唯一能够正确命名函数的人。这就是为什么我没有详细说明的原因。“SetCookieIfGetOtherwiseReturnCookie()”顺便说一句,文档注释是OP中的文本。它无论如何都不会传递要求,因为该函数除了文档注释所描述的内容之外还执行其他操作。然而,这又取决于OP在这方面的进一步工作。这只是一个例子。
if (!isset($_REQUEST['id']))
{
   $cookid = '115';
   setcookie("id", $cookid , time() + 31536000); 
}
else
  $cookid = $_REQUEST['id'];