Передача аргументов в PHP5
Проблема такая. Столкнулся лоб в лоб с различиями ООП-модели в PHP4 и PHP5. Имеется простая система управления на классах под PHP4. Недавно хостер сненил таки PHP с 4 на 5 - "PHP version 5.1.6". К чему я оказался совершенно не готов... И предупреждать конечно у нас не принято. Ну да ладно, вот код:
Код:
$users = array("***"=> array( "password"=>"***", "level"=>99 ));
$phpdbform_main->access = new phpdbform_access( &$users, "***" );
$phpdbform_main->access = new phpdbform_access( &$users, "***" );
В браузер выдаёт 500, а в логах следующее:
Код:
[24-Sep-2007 11:22:32] PHP Warning: Call-time pass-by-reference has been deprecated - argument passed by value; If you would like to pass it by reference, modify the declaration of [runtime function name](). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file. However, future versions may not support this any longer. in *** on line 33
Библиотеки работали без изменений и глюков год с лишним на куче сайтов с PHP4, так что ошибок быть не может.
Книжки под рукой нет, проект сдавать надо... Убегаю объясняться :((
new phpdbform_access( &$users, "***" );
идет попытка впихнуть $users по ссылке, что (без соотв. правок в php.ini) невозможно, т.к. фича была выкинута (deprecated) из этой новой версии ПХП.
Там же рекомендация - правьте обьявление ф-ии и укажите ИМЕННО ТАМ передачу п-ра по ссылке, в твоем случае, как понимаю, следует править функцию-конструктор phpdbform_access.
Вообщем, думаю предложенные в лог-записи правки в php.ini - не лучший вариант, может и вправду быстренько все поскидывать все амперсанды в аргументах при вызове ф-й/методов и оставить там, где этого требуют новые правила - в объявлении. Или есть жесткая необходимость в обратном? :(
Теперь даже не знаю куда лезть, библиотеки переписывать. Как нужно изменить представленную выше строку?
Цитата: foxweb
Дело происходит на хостинге, само собой, я бы всё настроил под себя...
Теперь даже не знаю куда лезть, библиотеки переписывать. Как нужно изменить представленную выше строку?
Теперь даже не знаю куда лезть, библиотеки переписывать. Как нужно изменить представленную выше строку?
Для начала:
Код:
$phpdbform_main->access = new phpdbform_access( $users, "***" );
Тут 3 варианта, или заработает, или заработает очень криво, или не заработает вовсе.
Все зависит от того, насколько критична для конструктора класса phpdbform_access, чей экземпляр создается в этой строке, необходимость передачи первого аргумента по ссылке.
ИМХО т.е., чтобы нормально подогнать код на ПХП5 под то, как он был задуман разработчиком, следовало бы править еще и сам конструктор класса, этот самый амперсанд всунуть туда (и только туда), это и будет свидетельствовать о необходимости передачи аргумента по ссылке:
Код:
class phpdbform_access {
// ........ ........
function phpdbform_access (&$users, $secondArg) // !!! &$users - passing by ref declaration
{
/*........*/
}
// ........ ........
}
// ........ ........
function phpdbform_access (&$users, $secondArg) // !!! &$users - passing by ref declaration
{
/*........*/
}
// ........ ........
}
Остается лишь не запутаться при поисках обьявления класса.
1) в вызовах функций не передовать ссылки на переменные........................ $bar = foo($foobar) // Фу... ну и бар...
2) по надобности п1) в наисании функции принимать ссылку на переменную... function foo(&$bar){ // и далее.
Я могу ошибатся.
У себя смотрю, в версии 4.4.7 с найтроками по умолчанию (рекомендуемыми) передача аргументов по ссылке при вызове тоже deprecated, может это фича "половым путем" из третих привалила в ранние 4-е релизы, а позднее разработчики "вылечели" :D
Однозначно ПХП шагает то ли к Сям++, то ли к Джаве, следует и писать соответственно. Хотите передавать по ссылке - будьте добры указать этот метод передачи в прототипе самой функции, а не пихать раз на раз, как придется во время выполнения. :)
Спасибо всем, кто ответил... Фуф. Ну в общем мои ожидания оправдались... запасаюсь кофе и в ночь... ))
Цитата:
php_value allow_call_time_pass_reference true