[英]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
但是,在我的情況下這是可以接受的。
null
。 我可以測試這個或使用隱式轉換。 $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 &
。
NULL
。 $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
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.