Я погрузился в код фреймворка Symfony (версия 4) и нашел этот фрагмент кода:
$env = $_SERVER['APP_ENV'] ?? 'dev';
Я не уверен, что это на самом деле делает, но я полагаю, что он расширяется до чего-то вроде:
$env = $_SERVER['APP_ENV'] != null ? $_SERVER['APP_ENV'] : 'dev';
Или, может быть:
$env = isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : 'dev';
Есть ли у кого-нибудь какая-нибудь точность по этому поводу?
Я только что обнаружил этот вопрос и, читая вашу правку, решил указать, почему вы ошибаетесь. Вам не нужно знать имя оператора, чтобы найти его, просто потому, что я думаю, что это довольно очевидно, что двойное "??" мог быть только «оператором» в PHP (особенно глядя на синтаксис в примере), поэтому этого простого предположения было достаточно, чтобы попытаться найти «операторы php» или «операторы php 7» в Google (обращая внимание на версию PHP, требуемую symfony 4) и найти ответ намного быстрее, чем писать вопрос здесь ( где, используя то же предположение, вы могли бы найти дубликат).
@gp_sflover для "операторов php 7" хорошо, у вас есть шансы найти. С "оператором php" ... удачи :) И это то, что сделал бы любой, кто никогда не видел его раньше. На мой взгляд, не совсем интуитивно думать, что это новая функция, которая была включена только в последнюю версию php. В любом случае, может я ошибаюсь, и мне просто нужно спать и просыпаться, чтобы понять это. Спасибо за ваше время :)
Я отмечаю это для повторного открытия. Это не просто набрать "php ??" или что-нибудь подобное в поле поиска, чтобы найти ответ. Даже сейчас, с этим вопросом "php" и "??" не будет отображать этот вопрос. Я рекомендую отредактировать заголовок, включив в него "??" так что другим будет легче найти. Во-вторых, @epixilog, отметив вопрос как повторяющийся, вы никоим образом не отразитесь на нем. Даже если он закрыт, он работал так, как задумал, когда вы нашли свой ответ. Он отмечен таким образом, чтобы мы могли хранить всю информацию вместе, а не осуждать людей, задающих вопросы.
@AndrewTFinnell Меня беспокоит не повторяющееся упоминание, на самом деле это -5 отзывов, которые я получил на свой вопрос; (
Я поддержал, потому что я также искал в Google «двойной вопросительный знак PHP». Это первый результат и отлично отвечает.
То же самое и здесь, благодаря этому вопросу я только что нашел менее чем за 10 секунд, что ?? означает в PHP, буквально набрав «оператор двойного вопросительного знака php» и подтвердив то, что я думал. Отлично
Мой поиск по запросу "двойной вопросительный знак php" привел меня сюда; теперь, если бы я только знал, что это называлось "оператор объединения", будучи таким очевидным термином ... Проголосовали за. Может быть, если бы его можно было назвать оператором Мадди Уотерса, знаете ли, параллельно с оператором Элвиса ?:






$x = $y ?? 'dev'
сокращенно для x = y, если y установлено, в противном случае x = 'dev'
Есть также
$x = $y = = "SOMETHING" ? 10 : 20
означает, что если y равно "ЧТО-ТО", то x = 10, в противном случае x = 20
Хороший $x = $y = = "SOMETHING" ? 10 : 20 Я этого не знал.
$myVar = $someVar ?? 42;
Эквивалентно :
$myVar = isset($someVar) ? $someVar : 42;
Для констант поведение такое же при использовании константы, которая уже существуют:
define("FOO", "bar");
define("BAR", null);
$MyVar = FOO ?? "42";
$MyVar2 = BAR ?? "42";
echo $MyVar . PHP_EOL; // bar
echo $MyVar2 . PHP_EOL; // 42
Однако для констант, которых не существует, это другое:
$MyVar3 = IDONTEXIST ?? "42"; // Raises a warning
echo $MyVar3 . PHP_EOL; // IDONTEXIST
Warning: Use of undefined constant IDONTEXIST - assumed 'IDONTEXIST' (this will throw an Error in a future version of PHP)
Php преобразует несуществующую константу в строку.
Вы можете использовать constant("ConstantName"), который возвращает значение константы или null, если константа не существует, но при этом будет появляться предупреждение. Вы можете добавить к функции оператор контроля ошибок@, чтобы игнорировать предупреждающее сообщение:
$myVar = @constant("IDONTEXIST") ?? "42"; // No warning displayed anymore
echo $myVar . PHP_EOL; // 42
если (! isset ($ _ SESSION ['captchaReq'])) {$ _SESSION ['captchaReq'] = 1; } if (! isset ($ _ SESSION ['captchaReq']) || $ _SESSION ['captchaReq'] <= 3) {throw new \ Exception ('Captcha Req Error'); } еще {$ _SESSION ['captchaReq'] ++; }
if (($ _ SESSION ['captchaReq'] ++ ?? $ _ SESSION ['captchaReq'] = 0) <3) {}
@ KamilDąbrowski да? Что это?
я не могу добавить пост, так как можно сократить код ?? . $ _SESSION ['numberRequests'] ++ ?? $ _ SESSION ['numberRequests'] = 0; это превосходная операция 3in1
Если не можете, не беспокойтесь о сокращении кода. Код, который вы можете легко читать и поддерживать, намного лучше, чем что-то короткое
Это «нулевой оператор объединения», добавленный в php 7.0. Определение того, как это работает:
It returns its first operand if it exists and is not NULL; otherwise it returns its second operand.
Так что на самом деле это просто isset() в удобном операторе.
Эти два эквивалента 1:
$foo = $bar ?? 'something';
$foo = isset($bar) ? $bar : 'something';
Документация: http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.coalesce
В списке новых возможностей PHP7: http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op
И оригинальный RFC https://wiki.php.net/rfc/isset_ternary
РЕДАКТИРОВАТЬ: Поскольку этот ответ получил много просмотров, небольшие пояснения:
1 Есть разница: в случае ?? первое выражение оценивается только один раз, в отличие от ? :, где выражение сначала оценивается в разделе условий, а затем второй раз в разделе «ответ».
$ foo = isset ($ y ++)? $ y ++: 'что-то'; Это не работает. Невозможно использовать isset для результата выражения.
@ascsoftw извините, удален, пока не найду лучший пример
Что касается последнего редактирования: количество раз, которое оно оценивается, также зависит от внутренней реализации ?? оператор (неужели один раз?)
+1 за ссылку на документацию. Время от времени я оказываюсь здесь, потому что оператор должен быть прописан, чтобы Google рассматривал его как поисковый запрос, но все, что мне действительно нужно, это прочитать документацию;)
Последнее редактирование не очень четкое / краткое. Мне было трудно читать и понимать это. Нашел то, что проясняет то, что вы хотели там сказать. Так что, пожалуйста, добавьте пример. php.net/manual/en/language.operators.logical.php#115208 $ a = (fruit (1)? Fruit (1): 'apple'); // fruit () будет вызываться дважды!
Обратите внимание, что, как и в случае с isset(), это также работает с undefined (например, типизированные свойства класса, которые еще не инициализированы).
Редактирование действительно ненужное и запутанное. Синтаксис для a??b, a?:b и a?a:b достаточно ясен, так что только последний имеет двойную оценку.
так значит $value = $value ?? null; что-то значит? (Строка из исходного кода API Google Cloud)
@AaA Я рассматриваю случай, когда переменная $value вообще не существовала.