【问题标题】:"Binding" variables by reference for delayed processing in class通过引用“绑定”变量以在类中进行延迟处理
【发布时间】:2015-07-18 12:48:23
【问题描述】:

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

撇开这种方法的优缺点不谈,我不能做的是每次发送查询时通过引用传递给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 值作为参考。这是代码的一个真正问题,但在进行上述更改后,它仍然显示相同的行为(或者更准确地说,没有显示预期的行为)。

【问题讨论】:

    标签: php arrays class pointers reference


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我同意它看起来很糟糕,但它是该方法中实际业务逻辑的简短版本,与问题无关。
    • @Ash 啊,明白了。我建议将其添加到您的 OP 中。我已经删除了我对 O(n^3) 的评论。
    • 您关于获取 foreach 值作为参考的观点是正确的。如果没有 & 运算符,每次都会复制数组。但是,我的代码仍然不起作用,这就是为什么我还没有选择答案。我得花点时间看看问题是否出在其他地方。
    • 已修改 foreach 以通过引用进行迭代,问题出在 OP 中缺少逻辑或在该方法之外。 In this example,迭代正确设置了测试字符串。
    • 这部分代码的问题确实是缺少 & 运算符。感谢您的帮助
    【解决方案2】:

    考虑这条线,

    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

    如果我建议,您需要为该类再次构建逻辑

    【讨论】:

    • 我真的不明白你的回答有什么意义。您真正的意思是您正确理解了我的代码并且存在代码设计问题,但您没有提出更好的方法。
    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多