0

有时我有可能未设置的变量,我想改用默认参数。像这儿:

if ($p == "a") doSomething();

如果$p没有定义 PHP 会抛出Notice: Undefined variable. 为了避免这种情况,我经常在这种情况下使用这个结构:

$p = (isset($p) ? $p : "");

但是,如果您必须经常使用它,那将很难看。所以我为它写了一个函数:

function getIfSet(&$value, $default = '')
{
    return isset($value) ? $value : $default;
}

// Example
if (getIfSet($p) == "a") doSomething();

我想知道是否有一个 PHP 函数可以解决这个问题或者你如何解决这个问题。

4

4 回答 4

1

只是一点点改进,更喜欢传递null$default,传递空字符串可能会令人困惑,因为正确的值可能是空字符串。

function getIfSet(&$value, $default = null)
{
    return isset($value) ? $value : $default;
}
$p = getIfSet($p);
于 2012-10-02T10:30:24.100 回答
0

isset() 尽可能干净。虽然我必须承认我不太喜欢默认为空字符串,只是因为变量可能是空字符串,但仍然“被设置”。我认为 bool false 或 null 的默认值会更符合 isset 的行为:

function getIfSet(&$value, $default = false)
{
    return isset($value) ? $value : $default;
}

$p = getIfSet($p);

if($p !== false){
     //insert or whatever
}
else{
    header('Location: error.php');
    exit;
}
于 2012-10-02T10:30:24.883 回答
0

根据您要检查的值类型(可能是 REQUEST 数据?),考虑使用类。它们很有趣,可以在任何地方使用。

假设你正在检查 POST 数据(如果你不这样做,那么,把它当作一个想法),创建一个检查这个数组的类:

class Post
{
    public function __get($index)
    {
        if (isset($_POST[$index]))
            return $_POST[$index];
        else
            return null;
    }
}

就如此容易。您知道当您尝试访问不存在的属性时 __get() 将触发。在这种情况下,如果该属性(实际上是 $_POST 数组中的索引)不存在,则返回 null 并且不会产生错误。

现在你可以这样做:

$params = new Post();
$foo = $params->name ?: ''; // of course this doesn't make much sense.

if (!$params->password) ...
// instead of 
if (isset($_POST['password'])) ...

// you'll still have to use isset for cases like:
if (isset($_POST['user']['password']) ...
if (isset($params->user['password'])) ...
// but still looks neater I'd say

您很快就会发现一个问题是 $params 不是超级全局变量,而 $_POST 是。如何解决这个问题?在控制器类的构造函数中创建它,并对您正在使用的所有其他对象使用依赖注入

于 2012-10-02T11:09:58.653 回答
0

当我想出这个解决方案时,我试图让 renocor 的答案更加干净和面向对象:

class NiceArray implements ArrayAccess {
    protected $array;

    public function __construct(&$array) {
        $this->array =& $array;
    }

    public function offsetExists($offset) {
        return true;
    }

    public function offsetGet($offset) {
        if (isset($this->array[$offset]))
        {
            return $this->array[$offset];
        }
        else
        {
            return null;
        }
    }

    public function offsetSet($offset, $value) {
        $this->array[$offset] = $value;
    }

    public function offsetUnset($offset) {
        unset($this->array[$offset]);
    }
}

用法:

$get = new NiceArray($_GET);
if ($get['p'] == "a") doSomething();

我知道这个类有点大,但是这样你仍然有一个数组,你可以很容易地将它用于你想要的每个数组。您无需更改以前可能拥有的任何代码。您仍然可以访问和更改数据。它甚至会改变原始数组。

于 2012-10-26T08:40:17.133 回答