PHP,isset以及如何摆脱重复的变量链?

时间:2011-11-15 10:17:04

标签: php

我有严格的错误报告。我必须使用isset,它让我在PHP中编写长的,重复的变量链。我有时会写这样的代码:

if (isset($my_object->an_array[$a_variable])):
        $other_variable = $my_object->an_array[$a_variable];
else:
        $other_variable = false;
endif;

if (isset($my_object->an_array[$a_variable])):
        return $my_object->an_array[$a_variable];
endif;

有时它更长更复杂。它不可读,并且需要花费太多时间才能输入。我想摆脱它。

问题
有没有办法只写一次$my_object->an_array[$a_variable]

7 个答案:

答案 0 :(得分:3)

您可以编写函数来封装重复代码:

function get_variable(array $array, $variable_name, $default_value=FALSE){
    if( isset($array[$variable_name]) ){
        return $array[$variable_name];
    }else{
        return $default_value;
    }
}

调整您的需求。

答案 1 :(得分:2)

最后我找到了两个解决方案。

我。 PHP中有运算符@。这非常危险,很难 http://www.php.net/manual/en/language.operators.errorcontrol.php

然而,在我的情况下这是可以接受的。

  1. 这不是致命的错误。
  2. 未定义变量的值定义为null。我可以测试这个或使用隐式转换。
  3. 我可以在极端情况下使用$php_errormsg
  4. 代码示例:

    $tmp = $false_object->property->property; #Throw notice
    $tmp = $false_array['a_field']['a_field']; #Throw notice
    $tmp = @$false_object->property->property; #Quiet
    $tmp = @$false_array['a_field']['a_field']; #Quiet
    echo $php_errormsg; #I can print that notice
    

    缺点是我没有收到括号内缺少引号的信息。

    $a = array('e'=>false);
    $tmp = $a[e]; #Throw notice
    $tmp = @$a[e]; #Quiet
    echo $php_errormsg; #This variable still works
    

    II。可以使用运算符&

    1. 未定义变量的值也是NULL
    2. $php_errormsg变量不适用于未定义的变量。
    3. 但是我注意到括号中没有引号。
    4. 代码示例:

      $tmp = $false_object->property->property; #Throw notice
      $tmp = $false_array['a_field']['a_field']; #Throw notice
      $tmp = &$false_object->property->property; #Quiet
      $tmp = &$false_array['a_field']['a_field']; #Quiet
      var_dump($tmp); #NULL;
      

      缺少报价问题:

      $array = array('a_field'=>true);
      $tmp = $array[a_field]; #Throw notice
      $tmp = @$array[a_field]; #Quiet
      $tmp = &$array[a_field]; #Throw notice
      

答案 2 :(得分:1)

function check($var)
{
   if(isset[$var])
       return $var;
   else 
       return "";
}

然后每次你需要检查一下这样的电话:

$other_b = check($b);

答案 3 :(得分:1)

我怀疑你会得到任何你认为满意的建议。我能建议的最好的就是这个,我想补充一点,我觉得它很难看:

function ifset ($var) {
    return is_null($var) ? false : $var;
}

定义了此功能后,您可以这样调用它:

$other_variable = ifset(@$my_object->an_array[$a_variable]);

请注意,此处需要使用错误抑制运算符,否则如果变量确实不存在,则会收到未定义的变量通知。 (你isset()不需要它的原因是isset()实际上是一个特殊的解析器令牌而不是普通的函数。)

答案 4 :(得分:1)

现在我遇到了同样的问题。我必须检查它然后得到它,它是如此ugrly。 所以我写这个函数

function get_val($arr,$key,$default_val=false){
   if(!is_array($arr)) return $default_val;
   $idx = explode('>>',$key);
   $tmp = $arr;
   $catched = true;
   foreach($idx as $index) { 
     if(!isset($tmp[$index])){
        $catched = false;
        break;
     }else{
        $tmp = $tmp[$index];
     }
   }
   if($catched) $default_val = $tmp;
   return $default_val;
}
//for example
$arr = array('k1'=>array('k2'=>array(1,'k22'=>22,'k23'=>array('k3'=>1))));
get_val($arr,'k1>>k2>>k23>>k3');

答案 5 :(得分:0)

在您的情况下,提取这些变量的方法可能会更好,然后:

class MyObject
{
    private $an_array;

    public function __construct()
    {
        $this->an_array = array();
    }

    public function get( $key )
    {
        if(isset($this->an_array[$key]))
            return $this->an_array[$key];

        return false; //or empty string
    }

    public function set( $key, $value )
    {
        $this->an_array[$key] = $value; 
    }

}

这样,你可以这样做:

$my_object->get($a_variable]);

答案 6 :(得分:0)

我使用这些小辅助函数来访问(多维)数组/对象的属性,而无需编写重复的isset()语句。它们可能不是运行速度最快的解决方案,但它们非常舒适:

// AI(data,1,default) === data[1] or default
function AI( $a, $i, $d=null ){
  if( is_array ($a)){ if( array_key_exists( $i, $a ))  return $a[ $i ];   return $d;  }
  if( is_object($a)){ if( property_exists(  $a, $i ))  return $a -> $i;   return $d;  }
  return $d;
}


// AII(data,1,2,3) === data[1][2][3] or null
function AII( $o ){
  $a  = func_get_args();
  $al = func_num_args();
  for( $i=1; $i < $al; $i++ ){
    $k = $a[$i];
         if( is_array ($o) && array_key_exists($k,$o))  $o =& $o[ $k ];
    else if( is_object($o) && property_exists ($o,$k))  $o =& $o -> $k;
    else return null; // nothing to access
  }
  return $o;
}


// AIID(data,1,2,3,default) == data[1][2][3] or default
function AIID( $o ){
  $a  = func_get_args();
  $default = end( $a );
  $al = count( $a ) - 1;
  for( $i=1; $i < $al; $i++ ){
    $k = $a[$i];
         if( is_array ($o) && array_key_exists($k,$o))  $o =& $o[ $k ];
    else if( is_object($o) && property_exists ($o,$k))  $o =& $o -> $k;
    else return $default;
  }
  return $o;
}


// AAID(data,[1,2,3],default) == data[1][2][3] or default
function AAID( $o, $a, $default = null ){
  foreach( $a as $k ){
         if( is_array ($o) && array_key_exists($k,$o))  $o =& $o[ $k ];
    else if( is_object($o) && property_exists ($o,$k))  $o =& $o -> $k;
    else return $default;
  }
  return $o;
}