Не работают ссылки в хуке

Добавляю хук (из ActionIndex) в плагине:
$this->AddHook("topics_list_show", "Prepend");

Добавляю метод:
function Prepend($aTopics) {
    $a = $aTopics["aTopics"];
    $a[] = array_shift(array_values($a)); // типа первый элемент добавляем в конец
    $aTopics["aTopics"] = $a;
}

Никаких изменений. Может так:
function Prepend(&$aTopics) {
    $a = $aTopics["aTopics"];
    $a[] = array_shift(array_values($a)); // типа первый элемент добавляем в конец
    $aTopics["aTopics"] = $a;
}

нет, тоже самое. И даже так:
function Prepend($aTopics) {
    $aTopics["aTopics"] = "";
}

ничего не меняется. Но если в ActionIndex.class.php изменить:
$this->Hook_Run('topics_list_show',array('aTopics'=>$aTopics));

на:
$this->Hook_Run('topics_list_show',array('aTopics'=>&$aTopics));

то все работает (копия первого топика добавляется в конец)!

В чем подвох?

7 комментариев

avatar
Подвоха нет, все верно. Если нужно передавать по ссылке НЕ объекты, то это должно явно указываться в Hook_Run
  • ort
  • 0
avatar
И как сделать то что я хочу правильно (не редактируя код движка)? По-моему, короче способа, чем в посте, нет.
avatar
да, верно
в этом хуке не предполагалось менять список топиков, только сами объекты топиков, поэтому и ссылки нет
можете сделать пулреквест на гитхаб
avatar
на:

$this->Hook_Run('topics_list_show',array('aTopics'=>&$aTopics));

то все работает (копия первого топика добавляется в конец)!
… и получить варнинг на новых версиях пхп про запрет передачи переменной по ссылке. вместо этого сам метод должен в объявлении указывать на возможность работы с переменной по ссылке.
avatar
Но работает только так. Если указать ссылку в методе плагина — я написал что никак не влияет. В классе хука ссылки везде указаны раз два
и получить варнинг на новых версиях пхп про запрет передачи переменной по ссылке
Не варнинг, а фатал еррор. И не получим, т.к. ссылка обернута в массив. Пример. Работает до 5.3.27, но если убрать ссылку у $ttt, то работает на всех версиях.
avatar
Не будет ни варнинга ни фатала в плоть до последней версии PHP, т.к. здесь ссылка внутри массива, так можно делать.
avatar
да, все верно. я уже увидел массив. ошибся
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.