Невозможно встроить тернарный оператор в оператор echo

Вот инструкция echo:

    echo " <a class=\"pagination-link\" href='{$_SERVER['PATH_INFO']}?page=$nextpage#comment-target'> &gt; </a> ";

А вот и ternary expression. Он присоединяет #comment-target к концу ссылки, только если условие истинно:

( $paginationAddCommentAnchor ?? null) ? '#comment-target' : null

Мне нужно заменить в заявлении echo, #comment-target на ternary expression, но каждая попытка заканчивается уродливым шаром грязи с неправильными цитатами. Пример попытки:

    echo " <a class=\"pagination-link\" href='{$_SERVER['PATH_INFO']}?page=$nextpage . ( $paginationAddCommentAnchor ?? null) ? '#comment-target' : null'> &gt; </a> ";

Каким будет правильный синтаксис, чтобы конечный результат был таким же, как исходный оператор echo, но полученный с помощью троичного?


person Robert Brax    schedule 02.05.2017    source источник
comment
$paginationAddCommentAnchor ?? null совпадает с $paginationAddCommentAnchor   -  person axiac    schedule 02.05.2017
comment
Использование нескольких строк и переменных значительно упростит чтение вашего кода.   -  person Quentin    schedule 02.05.2017
comment
PHP выполняет анализ переменных в строки, заключенные в двойные кавычки ("), но это все. Если вам нужно оценить выражение, вы должны поместить его за пределы строки и объединить его значение с окружающими строками, используя оператор конкатенации строк (.).   -  person axiac    schedule 02.05.2017
comment
@axiac о вашем первом комментарии, если я не поставлю $paginationAddCommentAnchor ?? null и переменная пуста, это вызовет ошибку.   -  person Robert Brax    schedule 02.05.2017
comment
@RobertBrax определяет пустой.   -  person axiac    schedule 02.05.2017
comment
@axiac я имел в виду не существующий   -  person Robert Brax    schedule 02.05.2017
comment
@RobertBrax не существует означает unset (или undefined), что то же самое как NULL и оценивается как FALSE в логическом контексте без каких-либо ошибок, предупреждений или уведомлений.   -  person axiac    schedule 02.05.2017
comment
@axiac: $commentAnchor = $paginationAddCommentAnchor ? '#comment-target' : null ; = ›'Undefined variable: paginationAddCommentAnchor'   -  person Robert Brax    schedule 02.05.2017
comment
@RobertBrax Вы правы, это вызывает уведомление. Лучше инициализировать все переменные с помощью NULL (или другого значения, в зависимости от назначения переменной) перед их использованием (поверх скрипта или функции или непосредственно перед блоком for, if и т. Д., Где они используются впервые). Это помогает писать код, который легче читать и понимать (и с меньшим количеством ошибок).   -  person axiac    schedule 02.05.2017


Ответы (2)


PHP выполняет анализ переменных в строки, заключенные в двойные кавычки ("), но это все. Если вам нужно оценить выражение, вы должны поместить его за пределы строки и объединить его значение с окружающими строками, используя оператор конкатенации строк (.).

Или, чтобы получить более читаемый код, используйте printf():

printf(' <a class="pagination-link" href="%s?page=%s%s> &gt; </a> ',
    $_SERVER['PATH_INFO'], $nextpage,
    $paginationAddCommentAnchor ? '#comment-target' : ''
);
person axiac    schedule 02.05.2017
comment
Спасибо, помогло, выберу в качестве ответа. Я сделал, как вы сказали, и сгенерировал переменную снаружи, а затем просто объединил ее. - person Robert Brax; 02.05.2017

Похоже, что вы пытаетесь сделать много вещей в одной строке, не контролируя правильно все части (кавычки, соединение строк, тернарный оператор ...). Чтобы все было ясно и под контролем, создайте последнюю строку в отдельных блоках:

$tmp_str = $nextpage . ( $paginationAddCommentAnchor ?? null) ? '#comment-target' : '';

echo "<a class=\"pagination-link\" href=\"{$_SERVER['PATH_INFO']}?page=$tmp_str\"></a>";

Проверьте это здесь.

person MarcM    schedule 02.05.2017