2011-06-07 105 views
4

我是一个非常糟糕的编码器,但我正努力变得更好。我最近编写了一些有用的东西,万岁!但我觉得必须有一个更清洁的方式。对象是:优化代码问题,多个如果其他语句PHP

如果存在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']; 
} 
+0

您的代码看起来像它应该做你想要它做什么?它不像预期的那样行事?如果你正在寻找一种更清洁的方法,我认为你已经有了一个非常简单的方法。只要有疑问,请使用“奥卡姆剃刀”,并使用简单的解决方案解决复杂的问题。祝你好运! – hypervisor666 2011-06-07 22:12:04

回答

4

以下是我会写它:

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

    setcookie("id", $cookid, time() + 31536000); 
} 

首先,按照一些约定,你应该测试肯定的情况下(isset(...)),而不是负(!isset())。我认为它使更多的可读代码,所以我已经切换它。其次,我使用ternary operatorcondition ? expr1 : expr2)消除了一个if/else块,这是可以接受的,因为您只是使用if/else块来决定将哪两个值分配给该变量。但是,应该谨慎使用三元运算符,因为如果过度使用它可能会使代码不易读。

第三,即使是单行if/else块,我也倾向于使用花括号,但至少我认为如果将它们用于if,则应该使用大括号作为else

最后,只是一个可读性说明:尽量与你的空白保持一致。在第四行中,=周围没有任何空格,但在第6行和第10行中后面有空格,但之前没有空格。为了便于阅读,在操作员的两边都留有空白几乎总是可取的。

哦,$_GET["id"]是正确的; $_GET[id]不是。如果您的错误报告级别足够高,它(正确)会发出警告(并且您通常应该使用error_reporting(E_ALL);进行开发,以便看到它们)。

+1

+1,但修复了您从问题中复制出来的小错字;) – KingCrunch 2011-06-07 22:12:11

+0

很高兴我问过这个问题,我之前从未听说过三元运算符,所以我学到了新的东西。 – 2011-06-07 22:14:53

+0

约翰:我已经给我的答案增加了几个指针。看一看。希望它有帮助。 – 2011-06-07 22:18:10

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

我会封装成可以很容易地重新使用的功能:

<?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'); 

最后,你需要做的,如果的你需要做的。要使自己的代码更好,并不总是那么容易,但是如果将它放入自己的函数中,则更容易修改。

+1

一个名为'cookie_get_value'的函数调用'setcookie()'?通过。尽管如此,文档评论块的道具。 – 2011-06-07 22:26:58

+0

当然,函数的名字只是一个猜测,价值非常有限。只有原始的OP应该命名该功能,因为它适合具体的需求,他是唯一能够正确命名它的人。这就是为什么我没有详细说明这一点。 “SetCookieIfGetOtherwiseReturnCookie()” – hakre 2011-06-07 22:38:06

+0

BTW文档注释是OP的文本。它不会传递任何要求,因为该函数除了文档注释描述之外还有别的功能。然而,OP还需要进一步开展这项工作。这只是一个例子。 – hakre 2011-06-07 22:39:51

0

我相信你可以使用$ _REQUEST,因为它已经有$ _ POST,$ _ GET和$ _COOKIE它

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