我有严格的错误报告。我必须使用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]
?
答案 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
然而,在我的情况下这是可以接受的。
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。可以使用运算符&
。
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
答案 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;
}