LINUX.ORG.RU

Интересно, почему так

 


1

1

Интересны две вещи: почему этот код работает?! И почему ИИ считает, что этот код содержит синтаксическую ошибку?!

$b=2;
$a=3;
$a = ($a*2)-$b = $b+3;
echo $a;

Я когда-то использовал такую констукцию с подстановкой, даже не сильно задумался, нсколько она правильная, но она работает. В общем то же самое (но ии это тоже считает, конечно же, неправильным, но тем не менее конструкция работает):

$x= $_GET['x']*cos(1)-$y=$_GET['y']*sin(1);
$y= $_GET['x']*sin(1)+$y=$_GET['y']*cos(1);

Алиса начинает что-то писать про цепочки присвоения, но именно эти варианты бракует.

Ответ на: комментарий от PeleWin

Аа, вот нашёл важное замечание в документации:

Замечание:

Хотя у оператора = более низкий приоритет, чем у большей части других операторов, PHP всё же разрешает писать так: if (!$a = foo()), в этом примере результат выполнения функции foo() присвоится переменной $a. Это возможно потому, что левая часть присваивания обязана быть переменной, поэтому присваивание группируется с этой переменной, а не с окружающим префиксным оператором, у которого приоритет выше. То же касается других префиксных операторов, которые принимают выражение в качестве операнда, таких как clone, операторы приведения типа, @ и ~: например, clone $a = $b группируется как clone ($a = $b), а не как (clone $a) = $b.

https://www.php.net/manual/ru/language.operators.precedence.php

PeleWin
()
Ответ на: комментарий от wandrien

разрабы PHP - наркоманы.

Неравда ваша. PHP — движок шаблонов, в который последовательно добавляли фичу за фичей. То, что на этом пытаются программировать — вообще не вина авторов PHP.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Ага, движок шаблонов, написанный неграмотными.

Вот несколько чисто синтаксических косяков в парсере выражений:

$firstElement = explode(',', $string)[0];

До 5.4 - не работало.

Неверный порядок свёртки тернарного оператора. Сломано всю жизнь.

Прикол из ОП - они считают это фичей, видимо. В топку такие фичи.

Не нужно оправдывать идиотизм тем, что это «движок шаблонов».

wandrien ★★★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

Для гостевой или вывода новостей из БД или даже файлов вполне PHP хватает.

Т.е. есть простую газету, блог или справочник на нем можно делать. Особенно если есть кеширующий сервер (тогда вообще не страшно).

AnonymUser
() автор топика
Ответ на: комментарий от wandrien

1. Я вот даже не проверял эту конструкцию. Потому что даже если бы она работала, я бы ждал от неё сегфолтов и прочих проблем по рандомным причинам. Ну, то что оно не работало до 5.4 - неудивительно. А как не работало, сегфолтилось?

2. Теперь сравни это с тем, как по-разному обрабатывается тернарный оператор в C и C++ режимах компиляции. Если тут что и сломано, то сама идея данного оператора и разрешение его использовать без круглых скобок в сомнительных местах. Я вот не помню ни как он парсится в Си, ни как в С++, ни как в пхп. Просто если есть выражение вида a+b?c:d то обязательно надо писать либо (a+b)?c:d либо a+(b?c:d), отсутствие тут скобок я бы ошибкой компиляции сделал. Аналогично с третьим аргументом оператора. Второй не обязательно, но для наглядности тоже в отдельных случаях лучше ставить. И даже тут a=(b?c:d) скобки весьма уместны.

3. Думаю просто не обратили внимание. Но эта конструкция вредна ровно так же как и тернарный оператор без скобок, который есть не только в пхп.

firkax ★★★★★
()
Ответ на: комментарий от wandrien

Сначала работает приоритет, потом ассоциативность.

Я бы скорее сказал что приоритеты в том виде, как их любят перечислять (таблицы с номерами и списками операторов), полноценный технический смысл имеют только для левоассоциативных операторов (которых подавляющее большинство). Правоассоциативные скорее являются исключениями из обычных правил парсинга и разбираются хардкодом без учёта вышеупомянутых таблиц. Правоассоциативных операторов всего два - присваивание (и его формы вида +=) и разыменование указателя (в пхп неактуально, но рассмотрим), и так вот, один из них бинарный, второй унарный, писать к ко всему этому универсальный парсер на случай «а вдруг ещё появятся» - сомнительная затея. Просто присваивание и разыменование захардкожены со своей уникальной (у каждого своя) логикой. И вот этот хардкод у C и у PHP чуть разный. Ещё можно скобки вспомнить, у которых типа тоже есть некий приоритет (большой), но по факту без хардкода там не обойтись, и учитывать в этом хардкоде символический приоритет скобок незачем.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Вообще-то - это от требований безопасности должно зависеть.

Если движок вывода новостей на файлах и нет админки, которая смотрит наружу, то не нужны никакие сервера.

AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария