【问题标题】:Variables within object operators对象运算符中的变量
【发布时间】:2011-10-11 20:54:41
【问题描述】:

我正在尝试在 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};

所以问题是有没有办法做到这一点。

【问题讨论】:

  • 从你上次的 sn-p:$keyValuePairs[$key] = $item->{$var1}()->{$var2}; 应该可以工作。您是否尝试过从字符串中取出括号?
  • 您收到的实际错误消息是什么?您能否进一步详细说明“失败”?什么失败了,你期待什么?哪一部分不是你想要的?

标签: php variables object operators


【解决方案1】:

你基本上可以这样做,但你必须把括号放在外面。

$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};

【讨论】:

    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    相关资源
    最近更新 更多