如果变量未设置,则为默认值

时间:2012-10-02 10:25:48

标签: php

我有时会设置可能未设置的变量,而我想使用默认参数。像这里:

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 个答案:

答案 0 :(得分:1)

稍微改进一下,更喜欢将null值传递给$default,传递空字符串可能会造成混乱,导致正确的值可以是空字符串。

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

答案 1 :(得分: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;
}

答案 2 :(得分: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是。怎么解决这个?在控制器类的构造函数中创建它,并对正在使用的所有其他对象使用Dependency Injection

答案 3 :(得分:0)

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

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();

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