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 :: Что означает выражение "$value= $value ?? 0;"?

 PHP.SU

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


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

> Без описания
ivanopol
Отправлено: 10 Апреля, 2016 - 13:46:37
Post Id


Новичок


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


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




Встретил в исходниках на GitHub'е такое выражение:
$value= $value ?? 0;
Стало интересно, что это означает. Поиском в гугле пока найти не удалось.
 
 Top
OrmaJever Модератор
Отправлено: 10 Апреля, 2016 - 14:43:04
Post Id



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


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


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




новый оператор php7 https://habrahabr[dot]ru/post/260351/
проверяет переменную на существование, если $value не существует то notice не будет, аналог


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Няшик
Отправлено: 10 Апреля, 2016 - 20:44:45
Post Id


Новичок


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


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




Дополню информацию от OrmaJever.

В более ранних версиях PHP тоже самое можно было сделать, таким вот способом
 
 Top
Мелкий Супермодератор
Отправлено: 10 Апреля, 2016 - 21:12:15
Post Id



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


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


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




Няшик, нет, этот способ как раз не эквивалентен и будет себя вести иначе.


-----
PostgreSQL DBA
 
 Top
Няшик
Отправлено: 10 Апреля, 2016 - 21:23:04
Post Id


Новичок


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


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




Мелкий пишет:
Няшик, нет, этот способ как раз не эквивалентен и будет себя вести иначе.

Прикреплено изображение (Нажмите для увеличения)
Снимок экрана (261).png
 
 Top
Мелкий Супермодератор
Отправлено: 10 Апреля, 2016 - 23:28:20
Post Id



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


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


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




Няшик, именно что 5 != 1. К тому же там true должен быть, а не 1. А для coalesce будет 5.


-----
PostgreSQL DBA
 
 Top
Няшик
Отправлено: 11 Апреля, 2016 - 06:52:29
Post Id


Новичок


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


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




Мелкий пишет:
Няшик, именно что 5 != 1. К тому же там true должен быть, а не 1. А для coalesce будет 5.


Ну что вы ? Начиная с 5.3.0 вплоть до 5.6.18 отрабатывает как надо!
И даже в php7 вы не увидите разницы Улыбка А уж в будущих версиях это тоже никто не тронет
http://sandbox[dot]onlinephpfunction[dot][dot][dot]866c11fb8c0625ec

И, что бы увидеть заветные true надо прогнать код для начала через var_export
Прикреплено изображение (Нажмите для увеличения)
Снимок экрана (262).png
 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Апреля, 2016 - 08:18:57
Post Id



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


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


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




Няшик, ещё раз:
PHP:
скопировать код в буфер обмена
  1.  
  2. $var = 'foo';
  3. $value= $var ?? 'bar'; // foo (string)
  4. $value= isset($var) ?: 'bar'; // true (bool)

(Отредактировано автором: 11 Апреля, 2016 - 08:21:20)

 
 Top
Няшик
Отправлено: 11 Апреля, 2016 - 13:44:17
Post Id


Новичок


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


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




armancho7777777 пишет:
Няшик, ещё раз:
PHP:
скопировать код в буфер обмена
  1.  
  2. $var = 'foo';
  3. $value= $var ?? 'bar'; // foo (string)
  4. $value= isset($var) ?: 'bar'; // true (bool)


А чего это мы isset не написали для первой переменной ???

ВО ПЕРВЫХ
PHP:
скопировать код в буфер обмена
  1.  
  2. $var = 'foo';
  3. $value[] = isset($var) ?? 'bar'; // true
  4. $value[] = isset($var) ?: 'bar'; // true
  5. var_dump($value);
  6.  


Во вторых
PHP:
скопировать код в буфер обмена
  1.  
  2. $var = 'foo';
  3. $value[] = !isset($var) ?? 'ЗАЧЕМ Я ТУТ НУЖЕН?? ТВОЮ МАТЬ!!!!! ЗАЧЧЕЕМ'; // False
  4. $value[] = !isset($var) ?: 'bar'; // bar
  5.  
  6. var_dump($value);
  7.  



Следовательно оператор `??` Либо написан от балды, и хрен знает зачем! Либо работает неправильно...

Нахрен он вообще нужен?? Если он никогда не вернёт - то, что мы задали
 
 Top
ivanopol
Отправлено: 11 Апреля, 2016 - 13:49:24
Post Id


Новичок


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


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




Всем спасибо, вопрос исчерпан.
 
 Top
armancho7777777 Супермодератор
Отправлено: 11 Апреля, 2016 - 14:13:39
Post Id



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


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


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




Няшик
PHP:
скопировать код в буфер обмена
  1. ($value ?? 'bar') // Конструкция вернет само значение, содержащееся в переменной $value, либо строку 'bar'. При этом не требуется проверка на существование переменной, как требовалось это делать в ранних версиях языка.
  2.  
  3. // Конструкция же ниже вернёт true, если переменная существует, в противном случае строку  'bar'
  4. (isset($value) ?: 'bar')

И умерь свой пафос.
2 нуля по кушу, зато гонору выше крыши.
Вопрос исчерпан.

(Отредактировано автором: 11 Апреля, 2016 - 14:52:20)

 
 Top
Няшик
Отправлено: 11 Апреля, 2016 - 14:45:02
Post Id


Новичок


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


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




[quote=armancho7777777][/quote]

А кто веляет??? Ты привёл пример не эквивалентному второму. Тут я и написал, почему не ISSET


И вот тебе пример в реальной работе с твоим `??` и `?:`
http://sandbox[dot]onlinephpfunction[dot][dot][dot]c666c99cc0f949a8
PHP:
скопировать код в буфер обмена
  1.  
  2. $var = 'Test';
  3.  
  4. $r[] = $var ?? 'Эх!'; // Test
  5. $r[] = !$var ?? 'Эх!'; // FALSE
  6.  
  7. // Иии
  8. $r[] = $var ?: 'Эх!'; // Test
  9. $r[] = !$var ?: 'Эх!'; // 'Эх!'
  10.  
  11.  


Я изначально думал что она идентичная, но когда попробовал в работе, выяснилась что это "ЭХ!" никогда не будет получена


Следовательно ?? - НАХЕР НЕ НУЖНА если мне надо, я буду использовать всегда ?: И из примера выше, понятно почему. И вам советую. И советую ТС
 
 Top
Мелкий Супермодератор
Отправлено: 11 Апреля, 2016 - 15:00:18
Post Id



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


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


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




Няшик пишет:
выяснилась что это "ЭХ!" никогда не будет получена

Вы явно зациклились на предположении, что coalesce и short ternary операторы имеют между собой что-то общее. Это не так, это разные операторы.
PHP:
скопировать код в буфер обмена
  1. $var = null;
  2. $r[] = $var ?? 'Эх!';
  3. unset($var);
  4. $r[] = $var ?? 'Эх!'; // E_NOTICE not raised!


-----
PostgreSQL DBA
 
 Top
OrmaJever Модератор
Отправлено: 11 Апреля, 2016 - 16:01:26
Post Id



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


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


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




Няшик пишет:
А чего это мы isset не написали для первой переменной ???

господи, да потому что он там не нужен. Вот зачем спорить с опытными людьми? Сказали что это разные операторы и всё. Если не понимаешь или не веришь то пойти почитай или потести.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
esterio
Отправлено: 13 Апреля, 2016 - 13:05:11
Post Id



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


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


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





Да там походу PhpDevel ибо что за MessBox.
 
 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