对于类中的延迟处理,通过引用“绑定”变量

时间:2015-07-18 12:48:23

标签: php arrays class pointers reference

我有以下课程的单身人士。我想要实现的是收集对整个应用程序中调用的各种数据库结果数组的引用,然后最终向数据库发出单个请求并获取一些替换值(转换),而不是为每个查询执行此操作。

抛开这种方法的优点和缺点,我不能做的是每次查询时通过引用传递给translate()方法的“原始”值(数据库结果)的实际替换被发送到数据库服务器。

class Translator {

    public $translatableTables = ['content' => ['title', 'body']];
    private $table = 'translations';
    private $queue = array();

    public function translate($table, &$results)
    {
        if(!isset($this->queue[$table])) {
            $this->queue[$table] = array();
        }
        $this->queue[$table][] =& $results;
    }

    public function fetchTranslations()
    {
        foreach($this->queue as &$table) {
            foreach($table as &$results) {
                foreach($results as &$result) {
                    $result->content = 'DON\'T PANIC THIS IS A TEST';
                }
            }
        }
        var_dump($this->queue);
        // dumps just the right data, so I know it's all been collected
    }

}

在请求生命周期结束时(但在生成输出之前),我在同一个单例实例上调用fetchTranslations()方法。 我期望发生的是要用字符串DON'T PANIC THIS IS A TEST替换的原始值,但这不起作用。

任何想法/想法?

编辑:3个嵌套的foreach循环可能看起来很糟糕,但这是该方法中实际业务逻辑的简短版本,与问题无关,为了便于阅读而跳过。

编辑:事实证明我应该将每个foreach值作为参考。这是代码的一个真正问题,但在进行所述更改后,它仍然显示相同的行为(或更准确地说,不显示预期的行为)。

2 个答案:

答案 0 :(得分:1)

你的foreach中的每一个都在复制数组,因为它有多个引用。 Discussion.

您可以&引用foreach值,也可以添加密钥,这样最后您就可以$this->queue[$i][$j][$k]->content = 'foo';

答案 1 :(得分:0)

考虑这一行,

public function translate($table, &$results)

评估为$results应用的更改应用于传递给该函数的变量。

现在,

if(!isset($this->queue[$table])) {
    $this->queue[$table] = array();
}
$this->queue[$table][] =& $results;

现在,没有采取任何措施来改变上述代码中的结果。

现在,请考虑以下内容,

public function fetchTranslations()
{
    foreach($this->queue as $table) {
        foreach($table as $results) {
            foreach($results as &$result) {
                $result->content = 'DON\'T PANIC THIS IS A TEST';
            }
        }
    }
}

现在,你通过了反对传递了它,但是$results毕竟会改变,而不是$this->queue

如果我建议,你需要为该类

再次构建逻辑