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
Форумы портала PHP.SU :: Версия для печати :: Передача параметров по ссылке
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Передача параметров по ссылке

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

1. evgenijj - 07 Мая, 2011 - 02:03:35 - перейти к сообщению
Однозначно -- нет. Идея по сути порочна . Один ламер порекомендовал другого ламера. Кто-то что-то умное сказал -- ему 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
Сколько минусов в профиле, или вообще... кирдык...

Помните, как в песне -- "Да и просто хотелось пожить!"
2. Champion - 07 Мая, 2011 - 09:01:30 - перейти к сообщению
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 функций?)
Кроме расположения функций в порядке от самого быстрого к самому медленному, хотелось бы увидеть оценку на сколько каждая более медленная функция проиграет более быстрой. Оценку можно дать хотя бы используя слова "сильно проиграет", "немного проиграет"
Поправил синтаксическую ошибку и уточнил как было бы интересно увидеть ответ
3. Мелкий - 07 Мая, 2011 - 10:32:47 - перейти к сообщению
Champion пишет:
На вскидку кто ответит приблизительное соотношение времени выполнения+вызова этих 4 функций?)

Спойлер (Отобразить)
4. EuGen - 07 Мая, 2011 - 15:19:02 - перейти к сообщению
Если интересно (хотя думаю, все отписавшиеся вверху знают ответы на эти вопросы) - можно описать.
Однако куда более правильным на мой взгляд является использование php 5.3 - в нем нельзя передавать ссылки на параметры. Изменил в соответствии с замечанием о неточности
Более того, использование передачи параметров функций по ссылке с тем, чтобы их изменить - это side-effect. Любые такие эффекты (будь то вот такое неявное изменение параметров, неглобальные константы или использование глобальных переменных) - есть не просто признак дурного стиля программирования, но и часто может привести к неожиданным результатам. Да и если функция пестрит определениями "global", то просто использовать ее в другом проекте ну никак не выйдет.
Поэтому, подводя итог - никогда не используйте "&" для side-effect. В php-версиях раньше 5.3 же следует использовать "&" только для передачи фактических параметров, которые явно будут велики по размеру.
Может, стоит перенести эту дискуссию в новую тему, так как все же это уже имеет слабое отношение к первоначальному вопросу
5. OrmaJever - 07 Мая, 2011 - 15:37:17 - перейти к сообщению
EuGen пишет:
Однако куда более правильным на мой взгляд является использование php 5.3 - в нем все параметры всегда передаются по ссылке
А?! а вот это новость! Как так? Использую 5.3.6 уже больше месяца и не замечал такого
6. EuGen - 07 Мая, 2011 - 16:37:38 - перейти к сообщению
Да, я несколько обобщил. Видимо, не очень верно.
Имелось ввиду что больше нельзя передавать в функцию ссылку на переменную начиная с 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.

Исправил в соответствии с замечанием.
7. OrmaJever - 07 Мая, 2011 - 17:37:59 - перейти к сообщению
аа я понял к чему это!
evgenijj пишет:
a ( $b, $c );
function a( &$b, &$c ){ ... }
или
a ( &$b, &$c );
function a( $b, $c ){ ... }

в первом сылка при обьвлении функции, а во втором при вызове.
Хмм... Я лично не когда не использовал первый вариант и даже думал что он не работает.
8. Мелкий - 07 Мая, 2011 - 18:38:20 - перейти к сообщению
OrmaJever пишет:
а вот это новость! Как так? Использую 5.3.6 уже больше месяца и не замечал такого

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

 

Powered by ExBB FM 1.0 RC1