PHP - 确定变量是未定义还是NULL

时间:2018-03-08 09:19:45

标签: php

我想编写一个函数来将一个未定义的变量设置为默认值,它可以阻止警告未定义的变量。

如果我使用isset()函数来确定输入变量,如果变量等于NULL,变量将更改为默认值。任何方法都可以实现吗?

示例:

function init_variable($input, $default = '123'){
    ...
    return $inited_variable;
}

$variable1 = init_variable($_POST['ABC']);
$variable2 = init_variable($_POST['DEF'], 'DEF');

5 个答案:

答案 0 :(得分:5)

自PHP 7以来,有一种更优雅的方式称为Null coalescing operator

$variable1 = $_POST['ABC'] ?? 'DEFAULT VALUE'

答案 1 :(得分:1)

如果您只想设置默认值:

PHP< v7(三元)

$var = isset($_POST['ABC'])) ? $_POST['ABC'] : false;

PHP> = v7(null coalesce)

$var = $_POST['ABC'] ?? false;

任何(大致相当的)

$var = false;

if(isset($_POST['ABC'])) $var = $_POST['ABC'];

答案 2 :(得分:0)

如果$_POST['ABC']不存在,则PHP将在此时引发错误:

init_variable($_POST['ABC'])

您无法阻止 init_variable内的发生此错误。您的函数只会收到尝试访问未定义变量/索引的最终结果,它无法阻止这种情况发生。

你想要的只是null coalescing operator

$variable1 = $_POST['ABC'] ?? '123';

或者也许:

$variable2 = isset($_POST['ABC']) ? $_POST['ABC'] : '123';

答案 3 :(得分:0)

您可以将其包含在项目中

https://github.com/rappasoft/laravel-helpers/blob/master/src/helpers.php

或使用此品种

if ( ! function_exists('array_get'))
{
    /**
     * Get an item from an array using "dot" notation.
     *
     * @param  array   $array
     * @param  string  $key
     * @param  mixed   $default
     * @return mixed
     */
    function array_get($array, $key, $default = null)
    {
        if (is_null($key)) return $array;
        if (isset($array[$key])) return $array[$key];
        foreach (explode('.', $key) as $segment)
        {
            if ( ! is_array($array) || ! array_key_exists($segment, $array))
            {
                return $default;
            }
            $array = $array[$segment];
        }
        return $array;
    }
}

它的作用是用点(.)分割字符串,然后尝试获取该数组中的元素。所以如果你做array_get($ array,' foo');就像你输入$ array [' foo']一样。 但是如果变量在数组中设置,它将返回它的值。 null是一个有效值,但不是您在$ _POST数组中可能找到的值。

但是如果您还希望过滤掉空值,我建议您使用手动检查而不是全部捕获。有时你想要那个null。 但是如果你需要一个函数,我建议修改上面的函数

if ( ! function_exists('array_get'))
{
    /**
     * Get an item from an array using "dot" notation.
     *
     * @param  array   $array
     * @param  string  $key
     * @param  mixed   $default
     * @return mixed
     */
    function array_get($array, $key, $default = null)
    {
        if (is_null($key)) return $array;
        if (isset($array[$key])) {
            $value = $array[$key];
            /**
             * Here is the null check. You can also add empty checks and other checks.
             */
            if(is_null($value)) {
               return $default;
            }
            return $value
        }
        foreach (explode('.', $key) as $segment)
        {
            if ( ! is_array($array) || ! array_key_exists($segment, $array))
            {
                return $default;
            }
            $array = $array[$segment];
        }
        return $array;
    }
}

然后你可以简单地使用

array_get($_POST,'abc','some default value');

这样你就不用担心它是否被证实。

额外的好处是,如果您有嵌套数组,这样可以轻松访问它们,而不必担心是否启动了较低的数组。

$arr = ['foo' => ['bar' => ['baz' => 'Hello world']]];

array_get($arr, 'foo.bar.baz', 'The world has ended');
array_get($arr, 'foo.bar.ouch', 'The world has ended');

答案 4 :(得分:0)

我使用:




  $ x = @ $ _ POST ['x'];
  
&# xA;


通常我想要的不仅仅是默认值,所以我做了以下其中一个:




  if($ x){。 ..} //如果它可以被视为一个布尔值
 if(!empty($ x)){...} //对于空字符串但不是NULL的情况是可能的
 if(isset) ($ x)){...} //只检查存在