如果变量未设置,使用函数来初始化变量 - PHP

4

执行脚本时,有时变量会被设置,有时不会。如果没有设置,我会收到一个提醒,指出该变量未定义。

为了清除此提醒,我只需添加以下代码:

if(!isset($var)) {
    $var = NULL;
}

这很有效,因为它测试变量是否已经设置,以便我们不会设置需要NULL的内容。但是在一个文件中有超过60个变量属于这种情况并且还有更多的变量要来,我认为创建一个简单的函数来处理会更容易。所以我从以下内容开始:

function init($var) {
    if(!isset($var)) {
        return $var = NULL;
    }
}

显然,这种方法行不通,并且还存在许多错误,会使大多数程序员感到烦恼(例如在函数内部使用!isset(),在if语句为false的情况下未提供返回语句等),但这只是为了让您基本了解我需要什么,以便在代码中可以调用init($var);来测试变量是否已经设置,然后创建一个并将其设置为NULL以避免出现提示。

这种方式可行吗?在函数外部使用函数测试变量是否已经设置?提前感谢您的帮助 :)


3
为什么你在处理那些你不确定是否已经设置的变量?如果你有用户输入,你可以将它们放入一个数组中,并优雅地对其进行迭代。 - kero
你正在操作变量的值,而不是实际的变量。 - Eisa Adil
1
原因是,例如其中一个变量是 $_POST['submit']。如果单击按钮提交表单,则该变量将具有值,否则它甚至不存在。因此,当调用它以在 if 语句中查看是否存在值时 if(($_POST['submit'])){...},它会输出一个通知告诉我 _Undefined Index_。 - SteppingHat
2个回答

3
如果您的意图是这样的:
if(variable is not set)
    set variable to NULL

如果使用引用,那么实现起来就非常容易:

function init(&$var) {
    if(!isset($var)) {
        $var = NULL;
    }
}

测试:

<?php
error_reporting(E_ALL);
function init(&$var) {
    if(!isset($var)) {
        $var = NULL;
    }
}

init($x);
var_dump($x);

输出:

NULL

1
这样做会不会在传递一个未设置的变量时生成一个通知? - Hardeep Singh
@HardeepSingh,我刚刚测试了一下:没有任何提示生成。试着运行我的示例代码。 - user4035
1
真不敢相信那能行... 你甚至可以将其因式分解为:function init(&$var){} - Ultimater
我喜欢它的简洁!选择了Ultimater的答案,因为你的代码更加精细,但除此之外,你的代码本来就是我一直在寻找的解决方案。谢谢! :) - SteppingHat
只是一个问题,所以我知道它确切地做了什么,&是什么作用? - SteppingHat
1
@SteppingHat 它创建了一个变量的引用:http://www.php.net/manual/en/language.references.php 实际上,当我看到创建引用定义了一个它所引用的变量时,我感到很惊讶。 - user4035

3

如果未初始化变量并将其作为参数传递给函数,则无法使用函数检查变量是否存在。但是,您可以定义一个包含脚本所需变量名称的数组,然后循环遍历它们并逐个检查它们是否存在。例如:

foreach(array('username','userid','userrole','posts','dob','friends') as $var)
{
    if(!isset($$var))$$var=NULL;
}

编辑:简化了user4035的方法,你可以将函数简化为:

<?php
function init(&$var){}
init($myVariable);
var_dump($myVariable);

甚至可以完全避免使用函数:

<?php
array(&$var1,&$var2,&$var3);//define several variables in one shot as NULL if not already defined.
var_dump($var1);
var_dump($var2);
var_dump($var3);

另一种方法是使用extract
<?php
$defaults=array('username'=>NULL,'userid'=>0,'userrole'=>'guest','posts'=>0,'dob'=>0,'friends'=>array());

$userid=24334;
$username='bob';
$friends=array(2,5,7);

extract($defaults, EXTR_SKIP);
echo '<pre>';
print_r(
    array(
    'userid'=>$userid,
    'username'=>$username,
    'friends'=>$friends,
    'userrole'=>$userrole,
    'posts'=>$posts,
    'dob'=>$dob)
);
echo '</pre>';

另一种方法是暂时禁用错误报告:

<?php
$v=ini_get("error_reporting");
error_reporting(0);
echo 'One';
echo $doh;//Use an undefined variable
echo ' Two';
error_reporting($v);

我建议不要采用这种方法,因为它只是隐藏了错误而没有解决问题,也会隐藏值得关注的错误。
而我个人最喜欢的方法是利用命名空间。通常你会将它们放在单独的文件中,但为了方便起见,我将它们放在一个代码片段中:
<?php
namespace //This is the global namespace
{
    $config=array('production'=>0);
}

namespace MyScript
{
   //Initialize all variables for our script
   //anything not defined here will be inherited from the global namespace
    $username=NULL;
    $userid=NULL;
    $userrole=NULL;
    $posts=NULL;
    $dob=NULL;
    $friends=NULL;

}

namespace MyScript\Main
{
//Define only two variables for our script
//Everything else will be inherited from the parent namespace if not defined
$username='Ultimater';
$userid=4;

    echo '<pre>';
    print_r(
        array(
        'userid'=>$userid,
        'username'=>$username,
        'friends'=>$friends,
        'userrole'=>$userrole,
        'posts'=>$posts,
        'dob'=>$dob,
        'config'=>$config)
    );
    echo '</pre>';
}

这是完整的答案和一个很好的方法。 - Thalaivar
这个很简单,非常优美 :) 我采用了你修改过的 user4035 原始代码的方法,因为它是所有方法中最简单的,并且最接近我的原始意图,所以感谢你!此外,在很长很长一段时间里(3年左右),我一直在做一个不正当的事情,就是关闭错误报告来绕过它,现在认为是时候彻底摆脱这些通知了。 - SteppingHat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接