【问题标题】:Using a function to initialise a variable if it not set - PHP如果未设置,则使用函数初始化变量 - PHP
【发布时间】:2013-12-25 16:33:10
【问题描述】:

执行脚本时,有时会设置变量,有时则不会。如果不是,我会收到未定义变量的通知。

为了清除通知,我简单地添加了以下代码

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

这只是根据需要工作,因为它会测试变量是否尚未设置,因此我们不会将我们需要的东西设置为NULL。但是在一个有 60 多个变量的文件中,我认为创建一个简单的函数会更容易。所以我从这个开始:

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

显然,这不起作用,并且还充斥着会惹恼大多数程序员的错误(例如函数内部的!isset(),如果 if 语句为 false,则不提供 return 语句等)但是这只是为了给你我需要的基本要点,所以在代码中我可以调用init($var); 来测试变量是否尚未设置,然后创建一个并将其设置为 NULL避免通知。

这甚至可能吗?使用函数来测试是否已经在函数之外设置了变量?在此先感谢:)

【问题讨论】:

  • 您为什么要使用您不知道是否已设置的变量?如果你有用户输入,你会将它们放在一个数组中,并且可以优雅地迭代它
  • 你在玩变量值,而不是实际变量。
  • 很好的理由是,例如其中一个变量是$_POST['submit']。如果单击按钮提交表单,则该变量将有一个值,否则它甚至不存在。因此,当需要在 if 语句中调用它以查看是否有值 if(($_POST['submit'])){...} 时,它会吐出一条通知告诉我 未定义索引

标签: php function variables initialization


【解决方案1】:

在将变量作为参数传递给函数的过程中,如果没有对其进行初始化,就不能使用函数来检查变量是否存在。但是,您可以定义脚本所需的变量名数组,然后遍历它们并检查它们是否存在。如:

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

我建议不要使用这种方法,因为它只是隐藏错误而不是修复它们,并且还会隐藏值得您注意的错误。

我个人最喜欢的是利用namespaces
通常你会将它们放在单独的文件中,但为了方便起见,我将它们放在一个 sn-p 中:

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

【讨论】:

  • 这是完整的答案和一个很好的方法。
  • 它很简单很漂亮 :) 我采用了您对 user4035 原始代码的编辑方法,因为它是所有代码中最简单的,并且最接近我的初衷,所以谢谢!同样很长一段时间(3~ 年),我一直在做一个狡猾的事情并关闭错误报告以绕过它,并认为是时候真正一劳永逸地摆脱通知了
【解决方案2】:

如果你的意图是这样的:

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

【讨论】:

  • 这不会在传递未设置的变量时生成通知吗??
  • @HardeepSingh 我刚刚测试过:没有生成通知。尝试启动我的示例代码。
  • 不敢相信这行得通...您甚至可以将其分解为:function init(&amp;$var){}
  • 我喜欢它的简单!由于您的代码的改进而选择了 Ultimater 的答案,但否则您的答案将是我一直在寻找的解决方案。谢谢! :)
  • @SteppingHat 它创建了对变量的引用:php.net/manual/en/language.references.php 实际上,当我看到创建引用定义了它引用的变量时,我感到很惊讶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多