【问题标题】:PHP function to check if a variable exist or not outside of a functionPHP函数检查变量是否存在于函数之外
【发布时间】:2011-07-10 21:08:28
【问题描述】:

我需要一个 PHP 函数来检查一个变量是否存在于函数之外。如果它不存在,则为其分配一个默认值。

函数类似于:function if_exist($argument, $default = '') 其中$argument 将是函数外的任何变量。可以是变量的变量,如果变量不存在,$default会是变量的默认值。

请避免在函数中使用全局作用域,因为我听说这对网站的安全性不利。

【问题讨论】:

  • 使用全局变量不一定与安全有关(不要大喊大叫),但它会使代码更难理解和维护......
  • 全局作用域与安全性几乎没有关系。纯粹主义者不喜欢全局作用域仅仅因为他们觉得它污染了命名空间并使程序难以维护。如果你不滥用它,你会没事的。

标签: php


【解决方案1】:

你可以发$argumentpass-by-reference:

function if_exist(&$argument, $default="") {
   if(!isset($argument)) {
       $argument = $default;
       return false;
   }
   return true;
}

DEMO

【讨论】:

  • +1 因为这是唯一明智的做法。我不认为它漂亮或应该使用它,而是依赖于 PHP 的一些黑魔法。
  • @Andrew:我不是这个意思。黑魔法是,您可以“传递一个未识别的变量”而不会触发某种错误。而是,PHP 将使用 null 静默初始化变量。
  • 郑重声明,您的大写锁定已开启。
【解决方案2】:

我根本不明白你为什么想要一个函数。

$a = isset($a) ? $a : "my default string";

每个人都会明白你的代码做了什么,而无需求助于 PHP 鲜为人知的“功能”,也不必查看你的函数体来了解它的作用。

尽管它可能看起来像一个函数调用,但它不是。 isset() 是一个语言结构!这就是它不会发出通知的原因。

【讨论】:

    【解决方案3】:

    有两种方法可以解决这个问题。您可能正在寻找第一个非空值,或者是否设置了实际变量...

    第一个用例很简单...要获取第一个不为空的变量的值,请定义一个函数:

    function coalesce() {
      $args = func_get_args();
    
      if(is_array($args))
        return null;
    
      foreach($args as $arg) {
        if($arg !== null)
          return $arg;
      }
    
      return null;
    }
    

    使用此功能很容易。只需使用多个不同的参数调用coalesce(),它总是会返回它遇到的第一个非空值。

    $myVar = coalesce($myVar, null, 'Hello There', 'World');
    echo $myVar; // Hello there
    

    但是,如果您正在寻找一个函数来检查一个变量是否已定义,并且如果它没有定义它,那么您需要创建一个函数来强制第一个参数为引用。

    function set_default(&$variable, $defaultValue = null) {
      if(!isset($variable)) {
        $variable = $defaultValue;
    
        return false;
      }
      return true;
    }
    

    【讨论】:

    • 否,当变量为 null 时,isset() 返回 false。 PS:您可能想要命名您的函数:) - 它必须是引用的原因是,所以 PHP 不会扔给您,您当然可以编辑它,同时在调用范围内仍然有效。
    【解决方案4】:

    使用这个:

    function setGlobalIfNotSet( $variableName, $defaultValue = false ) {
    
      if ( ! isset( $variableName )) {
    
        global $$variableName;
    
        $$variableName = $defaultValue;
    
      }
    
    }
    

    【讨论】:

    • 解释一下。例如,为什么要使用双印记($$$$variableName)?为什么会编译?
    【解决方案5】:

    你可以制作一个函数来使用isset:

    function isset_default($v, $default = '') {
        return isset($v) ? $v : $default;
    }
    

    用法:

    $v = isset_default($v, 'somedefaultvalue');
    

    【讨论】:

    • 嘿,哎呀。在我意识到他想要一个函数后,我知道我的答案会很糟糕
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多