1

在将 CakePHP 代码从 1.3 迁移到 2.x 时,我收到了这条通知消息:-

注意(8):间接修改重载属性LayoutHelper::$View没有效果【APP/View/Helper/LayoutHelper.php,第48行】

此通知的代码是:-

function __construct($options = array()) {
    $this->View =& ClassRegistry::getObject('view');
    $this->__loadHooks();

    return parent::__construct($options);
}

我应该怎么做才能解决这个问题?

4

1 回答 1

1

了解通知

该消息意味着正在设置一个使用魔法访问器访问的属性 - 它实际上不会做任何事情。它等价于:

<?php

class Foo {
        function __get($prop) {
            return [];
        }
}

$foo = new Foo;
$foo->bar['zum'] = "x";
print_r($foo->bar); // []

在这个人为的示例中,属性“bar”不存在,因此调用了魔术 getter,返回一个空数组 - 代码试图附加/写入这个魔术 getter-returned-value 并发出相同的通知:

注意:间接修改重载属性 Foo::$bar 在第 12 行的 /tmp/overload-example.php 中无效

print_r调用所示, 的值$foo->bar没有改变。

正常的解决方案是声明属性,以便使用魔法吸气剂,即:

class Foo {
    public $bar = []; // Now it can be modified.

但是,在这种情况下,这不是最合适的做法。

助手从 1.x 更改为 2.x

在迁移指南中的2.x 中更改了所有助手的构造函数。详细阅读迁移指南,尤其是在遇到问题时。

在 1.3 中,所有助手都扩展了助手类,它没有构造函数,并且不保留对视图的引用。在 2.x 中,所有助手都扩展了同一个类,但确实有一个构造函数并保留了对视图类的引用。有 2 个步骤与此错误相关,可将帮助程序升级为 2.x 兼容

更改构造函数:

无需重复父构造函数为您执行的逻辑,因此只需调用__loadHooks(如有必要):

function __construct(View $View, $settings = array()) {
    $this->__loadHooks();
    return parent::__construct($View, $settings);
}

将引用更改为$this->View

所有助手都可以访问视图实例,只需在您的助手代码中查找并替换即可:

$this->_View 

有了这个:

$this->View 
于 2015-09-23T08:17:10.707 回答