Переход на PHP 5.4 и Fatal error: Call-time pass-by-reference has been removed in



Ошибка подобного вида может появится на сайте, если хостинг сам обновит PHP до версии 5.4. Особенно часто такие обновления «без спросу» делают бесплатные хостинги. На платных чаще всего самому пользователю предоставляется выбор версии PHP.

Как бы то ни было — вы сами обновили версию или это сделали без вашего ведома — некоторый несовместимый PHP-код нуждается в доработке.

Что требует PHP 5.4

Теперь указание знака амперсанда (&) перед переменной при вызове функции вызывает фатальную ошибку и, как следствие, остановку выполнения дальнейшего кода. В PHP 5.3 это вызывало лишь предупреждение, а сейчас стало все строже. Как вы наверное помните, амперсанд указывает на передачу аргумента по ссылке. Такая передача, естественно, возможна и в новой версии PHP, но указывать знак амперсанда теперь нужно только в определении функции. То есть, например, здесь все оставляем как было:

1
2
3
function userFunc(&$arg) {
  return $arg++;
}

А вот здесь амперсанд убираем:

1
userFunc(&$arg);

Должно быть только так:

1
userfunc($arg);

Очевидно, что это не все ограничения новой версии. Это лишь то, с чем я лично столкнулся.

Осторожнее с предупреждениями PHP!

Можно сделать вывод что предупреждения, которые выдает интерпретатор PHP, все же надо учитывать. Кто знает, что вызовет фатальную ошибку в следующей версии? Например в PHP 5.4 статический вызов функции класса, если в определении данной функции не указано слово static, вызывает предупреждение. Пример:

1
2
3
4
5
6
class userClass {
  public function userFunc(&$arg) {
    return $arg++;
  }
}
userClass::userFunc($arg);

Лучше доработать такой код сейчас, не дожидаясь фатальных ошибок в будущем. Добавляем ключевое слово static:

1
2
3
4
5
6
class userClass {
  public static function userFunc(&$arg) {
    return $arg++;
  }
}
userClass::userFunc($arg);

Так гораздо надежнее.

Переход на PHP 5.4 и Fatal error: Call-time pass-by-reference has been removed in: 7 комментариев

    • Во всех фаилах PHP, где встречается данный код. А фаилы, как вы понимаете у всех разные…

  1. Спасибо. Помогло при использовании старого скрипта. Вылезала эта самая ошибка, теперь всё работает.

  2. Уфф, большой спасиб. Поменял PHP и наступил, конечно, на эти грабли. Найденные в Яндексе советы были, видимо, верными, но невнятными и весьма многословными. А тут — кратко и по существу. Сразу помогло!

  3. Большое спасибо за информацию. Неделю бился, пока на вашу статью не наткнулся. Написал хостеру и действительно оказалось, что они обновили версию php, а я восстановил сайт из бекапа за тот период, когда версия была еще 5,2.

    • Рад помочь. У меня в свое время тоже была похожая ситуация, собственно поэтому и решил написать решение — на память.

Добавить комментарий

Оставляя комментарий Вы соглашаетесь с Политикой конфиденциальности.