Fatal error: Only variables can be passed by reference

440hz

php.ru
Fatal error: Only variables can be passed by reference

перешел на PHP 5.0.5

SquirrelMail - версия 1.4.5 сразу вылетел.

Fatal error: Only variables can be passed by reference in /usr/local/www/squirrelmail/functions/imap_messages.php on line 480

479 function parsePriority($value) {
480 $value = strtolower(array_shift(split('/\w/',trim($value))));

где порыть?
 

fisher

накатила суть
выложи побольше кода, как зовется функция, и в каком случае возникает ошибка (при каком значении value). в 5-м пхп более строгая проверка на референсы, обычно лечится либо более строгими дефинициями, либо переписыванием куска возвращающего по ссылке что-либо типа true или false
 

crocodile2u

http://vbolshov.org.ru
Приходилось видеть такие ошибки. Часто они возникают из-за желания сэкономить строку кода в ущерб чистоте (ну, в 4-ке-то в общем все нормально, даже нотисов не возникает).

Типичный пример

PHP:
end(array_keys($my_array));
Посмотрев на мануал по end(), понимаем:
mixed end ( array &array ) - значит, аргумент передается по ссылке, и запись, которую мы видим в коде, действительно, слегка бессмысленна...

fisher
Значение $value тут ни при чем, тут передача по ссылке результата, который возвращает функция.
 

Screjet

Новичок
array_shift(split('/\w/',trim($value)))
исправить на:
$a = split('/\w/',trim($value));
array_shift($a);

fisher
Функции, влияющие на аргументы, должны принимать аргументы только по ссылке.
Иначе этим функциям не на что влиять :)
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: crocodile2u
Посмотрев на мануал по end(), понимаем:
mixed end ( array &array ) - значит, аргумент передается по ссылке, и запись, которую мы видим в коде, действительно, слегка бессмысленна...
А посмотрев историю CVS мануала по end(), видим, что какие-то ушлёпки сменили сигнатуру этой функции с end(array $array) на end(array &$array) не особо задумываясь о всякой там дурацкой обратной совместимости.

А потом другие ушлёпки добавили ещё и ошибку.
 

crocodile2u

http://vbolshov.org.ru
Sad Spirit
Да, таких вот вещей хватает... Помнится, я как-то раз, не подумавши, высказывал полупретензии к HTML_QuickForm - из-за похожей ситуации с is_a()... Это все, конечно, раздражает. Но, думаю, вертать назад никто уже не будет :-( Несмотря на фатал эрроры.
 

crocodile2u

http://vbolshov.org.ru
tony2001
О! Может быть, ты немного прояснишь ситуацию? Дело в том, что обратная совместимость в некоторых моментах, имхо, действительно нарушена...
 

tony2001

TeaM PHPClub
array_shift() и др. принимают аргумент по ссылке.
очевидно, что ссылка должна быть на переменную, а не на выражение.
да, это немного нарушает BC, но при этом это фиксит "неуловимые" сегфолты и memory corruptions.
более того, это уже с месяца полтора как пофиксено в CVS (но никто не тестит же, всё на умняке рассуждают про "ушлёпков").
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: tony2001
Sad Spirit
не угадал.
пробуй еще раз.
чавой-то я не угадал? вот diff с сообщением в стиле "краткость сестра таланта"
Parameters passed by reference
Изменения внесены в августе 2004. Вот Changelog PHP5, где я ваааще не вижу упоминания функции end().

В чём глыбокий смысл заставлять end() принимать reference вааще непонятно, т.к. она массив не меняет.

Конечно можно надеяться, что если дать толпе обезьян права на commit, то они в конце концов напишут крутой язык программирования для web, но пока чё-то как-то...
 

Screjet

Новичок
смысл заставлять end() принимать reference
Дык, ф-ция влияет на внутренний указатель..
А вот current() действительно ни на что не влияет, но с другой стороны ограничивает экстрималов типа: echo current( explode('.', "mail.yahoo.com") );
 
Сверху