在不知道名称的情况下访问对象属性?

时间:2011-07-07 18:56:30

标签: php

我正在编写一个访问两个不同数据对象的PHP脚本 - 一个由DB支持,另一个包含会话数据。它们都包含相同的字段 - 即会话对象中的数据在验证后将进入数据库。

我正在尝试编写一个函数,它首先检查db-backed对象的值,然后检查session-data-backed对象的值。然而,它不像我期望的那样工作。这就是我所拥有的。

<?php
    function check_cache($field){
            // $App is the DB backed object, $data is the session object
        return $app->$field ? $app->$field : $data->$field ? $data->$field : '';
    }
?>

我希望能够像这样调用函数:

<input type="text" value="<?php echo check_cache('address'); ?>" />

...但函数总是不返回任何内容。当我用实际的内联代码替换函数调用时,用$field替换我想要的字段名称,它可以工作。我错过了什么?

3 个答案:

答案 0 :(得分:1)

你应该确保$ app和$ data存在于函数的范围内(通过将它们作为参数传递给我们,我会留给你)。试试这个:

<?php
    function check_cache($field){
            // $App is the DB backed object, $data is the session object
        return $app->${$field} ? $app->${$field} : $data->${$field} ? $data->${$field} : '';
    }
?>

你应该扩展这个以确保$ app-&gt; $$字段存在等等。

修改

这是非常错误的,正如评论中的bob-the-destroyer所指出的那样。你只需要$app->$field。只需确保范围正确,您想要的成员不是私密的。道歉。

答案 1 :(得分:0)

我很想说它是一个范围问题,函数内部不存在$ app + $ data,只在外部。扩展函数以获取两个额外的参数,并以这种方式传入$ app + $ data对象。

<强>附录

这不会完全解决问题,你仍然需要访问对象的字段,具体取决于你的类结构,如果它的属性是私有的,会使一些备用答案不起作用,如字段将无法通过obj-&gt;字段语法访问。

答案 2 :(得分:0)

您可以尝试这样的事情:

<?php
    function check_cache($field){
        global $app, $data;
        // $App is the DB backed object, $data is the session object
        $av = eval("\$app->".$field);
        $dv = eval("\$data->".$field);
        return $av ? $av : $dv ? $dv : '';
    }
?>