Примечание (8): Косвенное изменение перегруженного свойства LayoutHelper::$View не имеет никакого эффекта [APP/View/Helper/LayoutHelper.php, строка 48]

При переносе кода 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);
}

Что мне делать, чтобы исправить это?


person Ankit    schedule 22.09.2015    source источник
comment
Что мне делать, чтобы исправить это? - Начать использовать функцию поиска? Об этом спрашивали несколько тысяч раз. Просто найдите сообщение об ошибке. Вряд ли вы первый, кто столкнулся с этим.   -  person floriank    schedule 23.09.2015
comment
возможный дубликат PHP - косвенная модификация перегруженного свойства   -  person floriank    schedule 23.09.2015
comment
@burzum бесполезен.   -  person AD7six    schedule 23.09.2015


Ответы (1)


Понимание уведомления

Сообщение означает, что устанавливается свойство, доступ к которому осуществляется с помощью магического средства доступа — на самом деле оно ничего не сделает. Это эквивалентно этому:

<?php

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

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

В этом надуманном примере свойство «bar» не существует, и поэтому магический геттер вызывается, возвращая пустой массив — код пытается добавить/записать это магическое-геттер-возвращенное-значение и выдает такое же уведомление:

Примечание. Косвенное изменение перегруженного свойства Foo::$bar не влияет на /tmp/overload-example.php в строке 12.

Как видно из вызова 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

Все помощники имеют доступ к представлению instance, просто найдите и замените в своем вспомогательном коде это:

$this->_View 

С этим:

$this->View 
person AD7six    schedule 23.09.2015