簡體   English   中英

PHP,isset以及如何擺脫重復的變量鏈?

[英]PHP, isset and how to get rid of repetitive chains of variables?

我有嚴格的錯誤報告。 我必須使用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]

您可以編寫函數來封裝重復代碼:

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

調整您的需求。

最后我找到了兩個解決方案。

I. PHP中有operator @ 這非常危險,非常艱難。
http://www.php.net/manual/en/language.operators.errorcontrol.php

但是,在我的情況下這是可以接受的。

  1. 這不是致命的錯誤。
  2. 未定義變量的值定義為null 我可以測試這個或使用隱式轉換。
  3. 我可以在極端情況下使用$php_errormsg

代碼示例:

$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。 可以使用operator &

  1. 未定義變量的值也將為NULL
  2. $php_errormsg變量不適用於未定義的變量。
  3. 但是我注意到括號中沒有引號。

代碼示例:

$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
function check($var)
{
   if(isset[$var])
       return $var;
   else 
       return "";
}

然后每次你需要檢查如下的電話:

$other_b = check($b);

我懷疑你會得到任何你認為滿意的建議。 我能建議的最好的就是這個,我想補充一點,我覺得它很難看:

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

定義了這個函數后,你可以像這樣調用它:

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

請注意,您需要此處的錯誤抑制運算符,否則如果變量確實不存在,您將獲得未定義的變量通知。 (你為isset()不需要它的原因是isset()實際上是一個特殊的解析器令牌而不是普通的函數。)

現在我得到同樣的問題。 我必須檢查它然后得到它,它是如此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');

我使用這些小助手函數來訪問(多維)數組/對象的屬性,而無需編寫重復的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;
}

在您的情況下,提取這些變量的方法可能會更好,然后:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM