Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Передача параметров по ссылке

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Тонкости передачи фактических параметров и объявления формальных
evgenijj
Отправлено: 07 Мая, 2011 - 02:03:35
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Выделено в отдельную тему из темы "Репутация на форуме"
Однозначно -- нет. Идея по сути порочна . Один ламер порекомендовал другого ламера. Кто-то что-то умное сказал -- ему 90% скажут фи-фи-фи. Оценить некому. Я тут сейчас выдам что-то на предмет передачи параметра по ссылке или по значению. Или еще хуже -- чем отличаются
a ( $b, $c );
function a( &$b, &$c ){ ... }
или
a ( &$b, &$c );
function a( $b, $c ){ ... }
Сколько здесь поймет?

P.S. Впрочем, если десяток напишет -- в чем отличие -- может и есть резон.

P.P.S. А если я ошибся - а за последние 3-4 года я ошибся не раз и не два (я тоже учусь). Мне за такие "уроки" -- что будет?
http://forum.php.su/topic.php?fo...topic=11&p=1
Сколько минусов в профиле, или вообще... кирдык...

Помните, как в песне -- "Да и просто хотелось пожить!"

(Отредактировано автором: 07 Мая, 2011 - 02:56:08)

 
 Top
Champion Супермодератор
Отправлено: 07 Мая, 2011 - 09:01:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Выделено в отдельную тему из темы "Репутация на форуме"
evgenijj пишет:
Сколько минусов в профиле, или вообще... кирдык...
Не понял, о чем это?)
evgenijj пишет:
чем отличаются
Тем, вызов функции с таким образом a(&a) устаревшая штука.
А вот на такой вопрос сколько ответят:
PHP:
скопировать код в буфер обмена
  1. function a1($a) {
  2. $a[1] = 1;
  3. }
  4. function a2($a) {
  5. $q = $a[1];
  6. }
  7. function a3(&$a) {
  8. $a[1] = 1;
  9. }
  10. function a4(&$a) {
  11. $q = $a[1];
  12. }

$a - большой при большой массив. На вскидку кто ответит приблизительное соотношение времени выполнения+вызова этих 4 функций?)
Кроме расположения функций в порядке от самого быстрого к самому медленному, хотелось бы увидеть оценку на сколько каждая более медленная функция проиграет более быстрой. Оценку можно дать хотя бы используя слова "сильно проиграет", "немного проиграет"
Поправил синтаксическую ошибку и уточнил как было бы интересно увидеть ответ
 
 Top
Мелкий Супермодератор
Отправлено: 07 Мая, 2011 - 10:32:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Выделено в отдельную тему из темы "Репутация на форуме"
Champion пишет:
На вскидку кто ответит приблизительное соотношение времени выполнения+вызова этих 4 функций?)

Спойлер (Отобразить)

(Отредактировано автором: 07 Мая, 2011 - 12:08:57)



-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 07 Мая, 2011 - 15:19:02
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Выделено в отдельную тему из темы "Репутация на форуме"
Если интересно (хотя думаю, все отписавшиеся вверху знают ответы на эти вопросы) - можно описать.
Однако куда более правильным на мой взгляд является использование php 5.3 - в нем нельзя передавать ссылки на параметры. Изменил в соответствии с замечанием о неточности
Более того, использование передачи параметров функций по ссылке с тем, чтобы их изменить - это side-effect. Любые такие эффекты (будь то вот такое неявное изменение параметров, неглобальные константы или использование глобальных переменных) - есть не просто признак дурного стиля программирования, но и часто может привести к неожиданным результатам. Да и если функция пестрит определениями "global", то просто использовать ее в другом проекте ну никак не выйдет.
Поэтому, подводя итог - никогда не используйте "&" для side-effect. В php-версиях раньше 5.3 же следует использовать "&" только для передачи фактических параметров, которые явно будут велики по размеру.
Может, стоит перенести эту дискуссию в новую тему, так как все же это уже имеет слабое отношение к первоначальному вопросу


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OrmaJever Модератор
Отправлено: 07 Мая, 2011 - 15:37:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Выделено в отдельную тему из темы "Репутация на форуме"
EuGen пишет:
Однако куда более правильным на мой взгляд является использование php 5.3 - в нем все параметры всегда передаются по ссылке
А?! а вот это новость! Как так? Использую 5.3.6 уже больше месяца и не замечал такого


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
EuGen Администратор
Отправлено: 07 Мая, 2011 - 16:37:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Перенесено из темы "Репутация на форуме"
Да, я несколько обобщил. Видимо, не очень верно.
Имелось ввиду что больше нельзя передавать в функцию ссылку на переменную начиная с 5.3, но можно принимать ссылку.
Детальнее
Цитата:

allow_call_time_pass_reference (boolean)
In PHP5, allow_call_time_pass_reference is deprecated, in versions prior to PHP 5.3.0, use of this feature will emit an E_COMPILE_WARNING, and in PHP 5.3.0+, the warning is a E_DEPRECATED notice.

Исправил в соответствии с замечанием.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OrmaJever Модератор
Отправлено: 07 Мая, 2011 - 17:37:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Перенесено из темы "Репутация на форуме"
аа я понял к чему это!
evgenijj пишет:
a ( $b, $c );
function a( &$b, &$c ){ ... }
или
a ( &$b, &$c );
function a( $b, $c ){ ... }

в первом сылка при обьвлении функции, а во втором при вызове.
Хмм... Я лично не когда не использовал первый вариант и даже думал что он не работает.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 07 Мая, 2011 - 18:38:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Перенесено из темы "Репутация на форуме"
OrmaJever пишет:
а вот это новость! Как так? Использую 5.3.6 уже больше месяца и не замечал такого

как я сегодня выяснил благодаря примеру Champion'a:
в функции параметры всегда передаются по ссылке (по крайней мере PHP5.2 и PHP5.3), даже если кажется, что передача идёт по значению. А вот дальше идёт фокус: реально копирование значения переменной, переданной по значению, будет произведено только при изменении этого значения. Поэтому функция a1 существенно медленнее всех остальных - только в ней массив реально копируется.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 07 Мая, 2011 - 19:39:20
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Перенесено в новую тему


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB