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]   

> Без описания
bestbios
Отправлено: 25 Сентября, 2013 - 23:45:46
Post Id



Гость


Покинул форум
Сообщений всего: 75
Дата рег-ции: Сент. 2013  


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




Курю маны по ссылкам http://php[dot]ru/manual/language[dot]re[dot][dot][dot]rences[dot]pass[dot]html

Вопрос почему следующая передача по ссылке является неправильной?

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function foo(&$var)
  4. {
  5.     $var++;
  6. }
  7. function bar() // Операция & отсутствует
  8. {
  9.     $a = 5;
  10.     return $a;
  11. }
  12. foo(bar()); // Вызывает неисправимую ошибку начиная с PHP 5.0.5
  13.  
  14. foo($a = 5); // Выражение, а не переменная
  15. foo(5); // Константа, а не переменная
  16. ?>
  17.  


Ведь bar() возвращает переменную $a, которая является ссылкой на значение 5.
те фактически тоже самое, что:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function foo(&$var)
  4. {
  5.     $var++;
  6. }
  7.  
  8. $a=5;
  9. foo($a);
  10. // $a здесь равно 6
  11. ?>
  12.  
 
 Top
MADONZY
Отправлено: 26 Сентября, 2013 - 01:22:35
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


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




& - означает что передаваться как аргумент может только переменная (если стоил около аргумента) или функция (если стоит около объявления функции)...что тебе не понятно?
при чём
PHP:
скопировать код в буфер обмена
  1. function foo(&$var)
  2. {
  3.     $var++;
  4. }

ничего не вернет и даже не увеличит на единицу! для того что-бы это произошло пиши:
PHP:
скопировать код в буфер обмена
  1. function foo(&$var)
  2. {
  3.     return ++$var;
  4. }
 
 Top
esterio
Отправлено: 26 Сентября, 2013 - 02:38:42
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




MADONZY пишет:
при чём
PHP:
function foo(&$var)
{
$var++;
}
ничего не вернет и даже не увеличит на единицу! для того что-бы это произошло пиши:

с какого перепуга нет? почему не увеличи на единицу? там же ссилка.
Вот зачем запутивать новичков

ок тогда вопрос в чем разница между $i++ и ++$i? как пример что будет если
PHP:
скопировать код в буфер обмена
  1. function foo(&$var)
  2. {
  3.         return $var++;
  4. }
  5.  
  6. $foo = 1;
  7. $bar = foo($foo);
  8. var_dump($foo, $bar);

тоесть какие будут значения переменных $foo и $bar?

(Отредактировано автором: 26 Сентября, 2013 - 11:28:25)

 
 Top
MADONZY
Отправлено: 26 Сентября, 2013 - 12:05:24
Post Id


Гость


Покинул форум
Сообщений всего: 104
Дата рег-ции: Июнь 2013  


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




2 и 1 это понятно, но как я понял то ф-я должна возвращать значение, а не менять его...
в инном случае зачем тагда эти ссылки вообще?
 
 Top
esterio
Отправлено: 26 Сентября, 2013 - 12:39:16
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




не нужно ничего возвращать. Я специально привел пример с вопросом.
При передачи по ссилке вы оперируете самой переменной(точнее ссилкой на нее) а не ее копией. При инкременте переменная увеличиться не только локальная $var но и глобальная $foo.
 
 Top
LIME
Отправлено: 26 Сентября, 2013 - 12:53:12
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




bestbios пишет:
Ведь bar() возвращает переменную $a, которая является ссылкой на значение 5.
как раз нет
в ф-ции bar переменная $a является локальной и ни как не связана с глобальной $a
следовательно будет возвращено значение 5 не связанное ни с какой переменной
а ф-ция foo требует именно ссылку на переменную
вот потому и ошибка
(Добавление)
bestbios пишет:
foo($a = 5); // Выражение, а не переменная
не совсем...выражение возвращающее переменную...для присвоения значения которой сначала выполняется правая часть выражения
 
 Top
bestbios
Отправлено: 26 Сентября, 2013 - 18:34:42
Post Id



Гость


Покинул форум
Сообщений всего: 75
Дата рег-ции: Сент. 2013  


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




Спасибо LIME, теперь понятно

PHP:
скопировать код в буфер обмена
  1. function bar() // Операция & отсутствует
  2. {
  3.     $a = 5;
  4.     return $a;
  5. }


возвращает 5

PHP:
скопировать код в буфер обмена
  1. function &bar()
  2. {
  3.     $a = 5;
  4.     return $a;
  5. }


возвращает &$a
 
 Top
LIME
Отправлено: 26 Сентября, 2013 - 21:54:19
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




последний прием передачи по ссылке не рекомендуется и в 5.4 вызовет ошибку если не ошибаюсь
только в параметрах указывать ссылку и никак иначе
это будет правильно
остальное от лукавого
 
 Top
armancho7777777 Супермодератор
Отправлено: 27 Сентября, 2013 - 08:36:58
Post Id



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


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


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




LIME пишет:
в 5.4 вызовет ошибку если не ошибаюсь

Нормально всё.
 
 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