Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача аргументов в PHP5

256
24 сентября 2007 года
foxweb
1.0K / / 27.07.2005
Давненько меня тут не было :)

Проблема такая. Столкнулся лоб в лоб с различиями ООП-модели в PHP4 и PHP5. Имеется простая система управления на классах под PHP4. Недавно хостер сненил таки PHP с 4 на 5 - "PHP version 5.1.6". К чему я оказался совершенно не готов... И предупреждать конечно у нас не принято. Ну да ладно, вот код:

 
Код:
$users = array("***"=> array( "password"=>"***", "level"=>99 ));
$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, так что ошибок быть не может.
Книжки под рукой нет, проект сдавать надо... Убегаю объясняться :((
1.9K
24 сентября 2007 года
InterWen
331 / / 16.09.2006
Вроде как вот тут:
new phpdbform_access( &$users, "***" );
идет попытка впихнуть $users по ссылке, что (без соотв. правок в php.ini) невозможно, т.к. фича была выкинута (deprecated) из этой новой версии ПХП.

Там же рекомендация - правьте обьявление ф-ии и укажите ИМЕННО ТАМ передачу п-ра по ссылке, в твоем случае, как понимаю, следует править функцию-конструктор phpdbform_access.

Вообщем, думаю предложенные в лог-записи правки в php.ini - не лучший вариант, может и вправду быстренько все поскидывать все амперсанды в аргументах при вызове ф-й/методов и оставить там, где этого требуют новые правила - в объявлении. Или есть жесткая необходимость в обратном? :(
256
24 сентября 2007 года
foxweb
1.0K / / 27.07.2005
Дело происходит на хостинге, само собой, я бы всё настроил под себя...
Теперь даже не знаю куда лезть, библиотеки переписывать. Как нужно изменить представленную выше строку?
1.9K
24 сентября 2007 года
InterWen
331 / / 16.09.2006
Цитата: 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
{
/*........*/
}

// ........ ........

}



Остается лишь не запутаться при поисках обьявления класса.
7.8K
24 сентября 2007 года
Tingo
201 / / 17.05.2007
В общем смысле вывод такой:
1) в вызовах функций не передовать ссылки на переменные........................ $bar = foo($foobar) // Фу... ну и бар...
2) по надобности п1) в наисании функции принимать ссылку на переменную... function foo(&$bar){ // и далее.

Я могу ошибатся.
1.9K
24 сентября 2007 года
InterWen
331 / / 16.09.2006
З.Ы. А что is 4я ПХП?
У себя смотрю, в версии 4.4.7 с найтроками по умолчанию (рекомендуемыми) передача аргументов по ссылке при вызове тоже deprecated, может это фича "половым путем" из третих привалила в ранние 4-е релизы, а позднее разработчики "вылечели" :D

Однозначно ПХП шагает то ли к Сям++, то ли к Джаве, следует и писать соответственно. Хотите передавать по ссылке - будьте добры указать этот метод передачи в прототипе самой функции, а не пихать раз на раз, как придется во время выполнения. :)
256
24 сентября 2007 года
foxweb
1.0K / / 27.07.2005
Спасибо всем, кто ответил... Фуф. Ну в общем мои ожидания оправдались... запасаюсь кофе и в ночь... ))
244
24 сентября 2007 года
UAS
2.0K / / 19.07.2006
В .htaccess в корне добавь:
Цитата:
php_value allow_call_time_pass_reference true

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог