我正在尝试在PHP中设置基于变量的对象运算符,但我只能在有限的范围内完成我要查找的内容。例如,以下代码允许变量选择:
$var1 = 'available_from';
$keyValuePairs[$key] = $item->parent()->{$var1};
但是,如果我想让父选择器也成为变量,我似乎不再能够。以下两种方法都失败了:
$var1 = 'parent()->available_from';
$keyValuePairs[$key] = $item->{$var1};
和
$var1 = 'parent()';
$var2 = 'available_from';
$keyValuePairs[$key] = $item->{$var1}->{$var2};
所以问题是是否有办法做到这一点。
答案 0 :(得分:17)
你基本上可以做到这一点,但你必须把parens放在外面。
$var1 = 'parent';
$var2 = 'available_from';
$keyValuePairs[$key] = $item->{$var1}()->{$var2};
// or $keyValuePairs[$key] = $item->$var1()->{$var2};
如果不使用eval,基本上没有办法解决这个问题:
// escape the first $
$keyValuePairs[$key] = eval( "\$item->$var1->$var2" );
但是,如果您可以先访问潜在的变量集,那么就没有理由使用eval。
你可以做这样的事情来解决它:
function call_or_return( $obj, $prop )
{
// test to see if it is a method (you'll need to remove the parens first)
$arr = array( $obj, $prop );
// if so call it.
if( is_callable( $arr ) ) return call_user_func( $arr );
// otherwise return it as a property
return $obj->$prop;
}
call_or_return( $item, $var1 )->{$var2};