Резюме
Если вы когда-либо смотрели на классическую конкатенацию строк и считали ее слишком неуклюжей, вам понравится интерполяция строк! Он был представлен в C# версии 6.0 и позволяет писать текст, который включает переменные в очень естественном и удобном для чтения виде. Они также очень хороши, позволяя вам интегрировать выражения непосредственно в строки, но будьте осторожны — в определенный момент ваша интерполированная строка может быть настолько полной, что ее станет труднее читать, чем другие.
This article has been fully translated into the following languages:
-
German
-
Portuguese
-
Russian
-
Spanish
Is your preferred language not on the list? Click here to help us translate this article into your language!
Неожиданное эхо «Использовать {$ array [‘as_usual’]} с фигурным синтаксисом.»; Неожиданный T_ENCAPSED_AND_WHITESPACE
Громоздкие имена и ссылки на цитируемые литералы .
Они используются в разных контекстах, но проблема синтаксиса весьма схожа. Предупреждения T_ENCAPSED … встречаются в контексте с двойными кавычками , а строки T_CONSTANT … часто сбиваются с помощью простых выражений или операторов PHP.
Неверная переменная интерполяция
И это чаще всего встречается при некорректной интерполяции переменных PHP:
Цитирование ключей массивов является обязательным в контексте PHP. Но в двойных кавычках (или HEREDOC) это ошибка. Парсер жалуется на содержащиеся в одиночном кавычки , потому что он обычно ожидает литеральный идентификатор / ключ.
Точнее, это справедливо для использования стиле PHP2 для ссылок на массивы:
Вложенные массивы или более глубокие ссылки на объекты, однако, требуют синтаксиса синтаксиса:
Если вы не уверены, это обычно безопаснее использовать. Его часто считают более читаемым. И лучшие IDE на самом деле используют для этого разную синтаксическую раскраску.
Отсутствует конкатенация
Если строка следует за выражением, но не имеет конкатенации или другого оператора, то вы увидите, что PHP жалуется на строковый литерал:
Хотя это очевидно для вас и меня, PHP просто не может догадаться, что строка должна быть добавлена ??туда.
Сбивающие с толку строковые кавычки
Такая же синтаксическая ошибка возникает при смешивании строковых разделителей . Строка, начинающаяся с одной или двойной кавычки, также заканчивается тем же.
Этот пример начинался с двойных кавычек. Но двойные кавычки также предназначались для атрибутов HTML. Предполагаемый оператор конкатенации внутри, однако, интерпретировался как часть второй строки в одинарных кавычках.
Это хороший пример, когда вы не должны выходить из двойных кавычек в первую очередь
Вместо того, чтобы просто использовать правильные побеги для HTML атрибутов? кавычки:
Хотя это также может привести к путанице в синтаксисе, все лучшие IDE / редакторы снова помогают раскрасить экранированные кавычки по-разному.
Здесь он станет строковым литералом после голого слова, когда, очевидно, должен быть строковый параметр.
Списки массивов
Если вы пропустите запятую в блоке создания массива, синтаксический анализатор увидит две последовательные строки:
Обратите внимание, что в последней строке всегда может содержаться дополнительная запятая, но игнорировать одно между ними непростительно. Это трудно обнаружить без подсветки синтаксиса.
То же самое для вызовов функций :
Беглые строки
Общим вариантом являются довольно просто забытые терминаторы строк:
Здесь PHP жалуется на два строковых литерала, непосредственно следуя друг за другом
Но настоящая причина — незакрытая предыдущая строка, конечно.
Библиотеки
Чтобы импортировать в библиотеку способ чтения внешних, возможно , скомпилированные, процедуры, программы или пакеты. Импорт можно классифицировать по уровню (модуль, пакет, класс, процедура, …) и по синтаксису (имя директивы, атрибуты, …)
- Импорт файла
- MATLAB
- КОБОЛ
- Пролог
- ASP
- , AutoHotkey , AutoIt , C , C ++
- AutoHotkey , AutoIt , C , C ++
- , Цель-C
- Цель-C
- Математика и язык Wolfram Language
- Фортран
- PHP
- , Выберите «Базовый»
- Выбрать базовый
- Ржавчина
- Сокол
- красный
- Lua
- Perl , PHP
- р
- Импорт пакета
- C , C ++
- , Ржавчина
- Цель-C
- Математика и язык Wolfram Language
- Пролог :
- Python
- , Ржавчина
- Ржавчина
- , Ржавчина
- R :
- , Сокол
- Сокол
- Оберон
- Перейти :
- , D
- D
- , Haskell
- Haskell
- Java , MATLAB , котлин
- JavaScript :
- , JavaScript :
- Scala
- , Scala
- Быстрый
- , Python
- Lua :
- , Fortran 90 +
- Fortran 90 +
- , Perl
- Perl
- Кобра
- Паскаль
- Ада
- Импорт класса
- Python
- Сокол
- Java , MATLAB , котлин
- , JavaScript
- , JavaScript
- JavaScript
- , Scala
- , Scala
- Scala
- , PHP
- PHP
- Импорт процедуры / функции
- Python :
- , D :
- D :
- Haskell :
- , JavaScript :
- , JavaScript :
- JavaScript :
- MATLAB :
- , Scala :
- Скала :
- Perl :
- , PHP :
- PHP :
- , Ржавчина :
- , Ржавчина :
- Ржавчина :
- Постоянный импорт
use const Namespace\CONST_NAME; PHP
Вышеупомянутые операторы также можно классифицировать по тому, являются ли они синтаксическим удобством (позволяя ссылаться на вещи по более короткому имени, но они все равно могут ссылаться на какое-либо полностью определенное имя без импорта) или действительно ли они необходимы для доступа код (без которого невозможно получить доступ к коду даже с полностью определенными именами).
- Синтаксическое удобство
- Джава
- Джава
- OCaml
- Требуется код доступа
- Идти
- JavaScript
- Python
Неожиданный (
Открывающиеся круглые скобки обычно следуют языковым конструкциям, таким как //// или запускают арифметическое выражение. Они синтаксически неверны после , предыдущего , одиночного и в некоторых типичных контекстах объявления.
-
Параметры объявления функции
Редкое появление этой ошибки пытается использовать выражения в качестве параметров функции по умолчанию. Это не поддерживается даже в PHP7:
Параметры в объявлении функции могут быть только литеральными значениями или постоянными выражениями. В отличие от функций invocations, где вы можете свободно использовать и т.д.
-
По умолчанию свойства класса
То же самое для деклараций членов класса, где допускаются только значения литерала/константы, а не выражения:
Поместите такие вещи в конструктор. См. Также Почему атрибуты PHP не позволяют выполнять функции?
Снова отметим, что PHP 7 допускает только там постоянные выражения.
-
Когда это происходит, оно обычно указывает на неисчерпаемую предыдущую строку; и буквальные разделы, попадающие в контекст кода PHP.
-
isset (()), пустой, ключ, следующий, текущий
И и являются языковыми встроенными, а не функциями. Им нужно получить доступ к переменной напрямую. Если вы слишком часто добавляете пару круглых скобок, вы должны создать выражение:
То же самое относится к любой языковой конструкции, для которой требуется неявный доступ к имени переменной. Эти встроенные модули являются частью языковой грамматики, поэтому не допускают декоративных дополнительных круглых скобок.
Функции уровня пользователя, требующие ссылки на переменные -but, получают результат выражения passed-, вместо этого приводят к ошибкам во время выполнения.
Обработка переменных в строках
Существует два типа синтаксиса обработки переменных в строках: простой и сложный.
Простой синтаксис — это когда имя переменной указывается в строке как есть.
Когда интерпретатор встречает знак доллара, он начинает последовательно проверять являются ли все последующие символы допустимыми символами в имени переменной. Таким образом, чтобы сформировать правильное имя переменной, он захватывает так много символов, на сколько это возможно:
$str = "World!"; echo "Hello $str";
Сложный синтаксис — это когда имя переменной заключается в фигурные скобки.
Так как, для обработки переменной в строке, интерпретатор захватывает так много символов, на сколько это возможно бывают ситуации когда интерпретатор не способен самостоятельно определить, где оканчивается имя переменной:
$sport1 = 'волей'; $sport2 = 'фут'; echo "Мне нравится $sport1бол и $sport2бол";
В данном случае не будет достигнут желаемый результат, поскольку интерпретатор будет считать как часть имени переменной , которой не существует.
Чтобы явно указать интерпретатору, где оканчивается имя переменной требуется заключить имя переменной в фигурные скобки:
$sport1 = 'волей'; $sport2 = 'фут'; echo "Мне нравится {$sport1}бол и {$sport2}бол.";
Знак доллара может быть расположен как перед фигурной скобкой, так и после неё:
$sport1 = 'волей'; $sport2 = 'фут'; echo "Мне нравится ${sport1}бол и {$sport2}бол.";
Расширенная форма Бэкуса-Наура
Как уже говорилось, отсутствие в нотации формальных грамматик (и БНФ) средств
явного задания повторений создает ряд трудностей. Во-первых, определения оказываются сложными для понимания, недостаточно наглядными из-за обилия рекурсий. Во-вторых, возникают проблемы с тем, что грамматики, дающие подходя-
щие семантические деревья, оказываются леворекурсивными.
При описании Модулы-2 и Оберона Н. Вирт использовал расширенную Бэкуса-Наура форму (РБНФ). Главные модификации касаются введения скобок { и}
для повторений, а — для обозначения необязательного вхождения цепочек
терминалов и нетерминалов в правые части правил. Соглашения относительно
обозначений терминалов и нетерминалов также изменены, что не столь принципиально.
В дальнейшем мы будем пользоваться именно РБНФ. Вот как она определяется в спецификации Оберона-2:
Варианты разделяются знаком |. Квадратные скобки означают необязательность записанного внутри них выражения, а фигурные скобки { и } означают
его повторение (возможно, 0 раз). Нетерминальные символы начинаются с заглавной буквы (например, Оператор). Терминальные символы или начинаются
малой буквой (например, идент), или записываются целиком заглавными буквами (например, begin), или заключаются в кавычки (например, «:=»).
К этому следует добавить, что в роли знака «есть по определению» в РБНФ
используется «=», а каждое правило заканчивается точкой.
Вот так может быть определен синтаксис идентификатора (имени) с помощью
РБНФ:
Имя = Буква { Буква | Цифра }.
Являясь метаязыком, РБНФ должна быть пригодна для описания языков, имеющих практический интерес. В том числе с помощью РБНФ может быть определен и синтаксис самой РБНФ:
Синтаксис = { Правило }. Правило = Имя "=" Выражение Выражение = Вариант { "I" Вариант }. Вариант - Элемент { Элемент }. Элемент = Имя | Цепочка | "{" Выражение "}" | "" | "{" Выражение "}". Цепочка = "'" { символ ) "'" | '"'{ символ } '"'.
В этих определениях не сделано различий между именами, обозначающими
терминалы и нетерминалы, хотя сформулировать это на РБНФ было бы несложно. Различение имен вынесено за рамки синтаксиса и может быть специфицировано (и специфицируется) отдельно. Подобным же образом часто поступают при
определении языков программирования.
Синтаксические диаграммы
Синтаксическая диаграмма — это направленный граф с одним входным ребром и одним выходным ребром и помеченными вершинами. Синтаксическая диаграмма задаёт Формальный язык. Цепочка пометок при вершинах на любом пути от входного ребра к выходному — это цепочка языка, задаваемого синтаксической диаграммой. Поэтому можно считать, что синтаксическая диаграмма — это одна из форм порождающей грамматики автоматных языков. Синтаксические диаграммы и конечные автоматы имеют тесную связь: любой автоматный язык задаётся синтаксической диаграммой и обратно, по любой синтаксической диаграмме можно построить конечный автомат(в общем случае недетерминированный), распознающий тот же язык, который задаёт диаграмма.
Построив по синтаксической диаграмме соответствующий распознающий конечный автомат, можно затем реализовать этот автомат либо аппаратно, либо программно.
Таким образом, синтаксические диаграммы могут служить не только для порождения, но и для распознавания автоматных языков.
Диаграммы стали популярны после выхода книги К. Йенсен и Н. Вирта «Паскаль». Они использованы в первой ее части — «Руководстве» — компактном учебнике языка. На рис. 3.1 показана одна из имеющихся там диаграмм.
Управляющие конструкции
Общие правила стиля для управляющих конструкций следующие:
- ДОЛЖЕН быть один пробел после ключевого слова управляющей конструкции
- НЕ ДОЛЖНО быть пробела после открывающих круглых скобок
- НЕ ДОЛЖНО быть пробела перед закрывающими круглыми скобками
- ДОЛЖЕН быть один пробел между закрывающей круглой скобкой и открывающей фигурной скобкой
- Тело конструкции должно быть с одним отступом
- Закрывающая фигурная скобка ДОЛЖНА быть на следующей строке после тела управляющей конструкции
Тело каждой конструкции ДОЛЖНО быть заключено в фигурные скобки. Это стандартизирует вид конструкций, и уменьшает вероятность внесения ошибок при добавлении новых строк к телу управляющей конструкции.
5.1. , ,
Оператор выглядит следующим образом
Обратите внимание на размещение круглых скобок, пробелов и фигурных скобок; и что и находятся на одной линии, как и закрывающая фигурная скобка тела оператора
Ключевое слово СЛЕДУЕТ использовать вместо так что все управляющие ключевые слова выглядят как единые слова.
5.2. ,
Конструкция выглядит следующим образом
Обратите внимание на размещение круглых скобок, пробелов и фигурных скобок. Оператор ДОЛЖЕН быть с одним отступом от , а ключевое слово (или другое завершающее ключевое слово) ДОЛЖНО быть с таким же отступом как тело оператора
ДОЛЖЕН быть комментарий, такой как когда есть преднамеренное падение в не-пустое тело оператора .
5.3. ,
Кроме того, оператор выглядит следующим образом
Обратите внимание на размещение круглых скобок, пробелов и фигурных скобок
За рамками переменных
Теперь мы включили переменные и даже свойства объектов в наши строки, и мы видели, как легко мы можем отформатировать полученные строки. Но интерполяция строк выходит за рамки этого, потому что вы можете иметь целые выражения C# внутри строк, если они приводят к чему-то, что может быть добавлено к строке. Отличным примером этого является классическая»с или без концовкой а » — ситуация, когда вам нужно создать строку либо «1 год» или «2 года». Это можно сделать непосредственно с помощью интерполяции строк, просто используя тернарный оператор внутри строки:
Обратите внимание, как я вставил простой оператор if-then-else в строку внутри набора скобок. Мы можем сделать это, потому что результатом выражения является строка-либо пустая, либо «а»
Вы также можете сделать расчеты:
Опять же, пока результат выражения можно преобразовать в строку, его можно использовать в объединенной строке.
Строки форматирования
По умолчанию переменные строки будут включены в представленную строку путем вызова на них метода tostring(). Но иногда вы можете искать немного большего контроля над тем, как отображается каждая переменная, и, к счастью, это очень просто сделать, благодаря строкам форматирования. Просто поместите двоеточие (:) после переменной, а затем введите строку форматирования, которая будет использоваться, как в этом примере:
Результат будет чем-то вроде этого, в зависимости от установок вашей системы для дат и чисел:
Обратите внимание, что дата представлена в длинном формате даты (как указано в строке формата «D»), а число красиво отформатировано с тысячами разделителей и двумя десятичными числами благодаря строке числового формата «N2». Если вам нужен больший контроль, вы можете менять формат строк от значения по умолчанию до пользовательского, например, дату:
Если вам нужен больший контроль, вы можете менять формат строк от значения по умолчанию до пользовательского, например, дату:
Существует гораздо больше способов форматирования ДатыВремени, которые вы можете использовать во вставленной строке. Для ознакомления , пожалуйста, проконсультируйтесь на documentation.
Неожиданное T_CONSTANT_ENCAPSED_STRING Неожиданный T_ENCAPSED_AND_WHITESPACE
имена и относятся к цитированным литералам.
Они используются в разных контекстах, но проблема синтаксиса весьма схожа. T_ENCAPSED… предупреждения встречаются в контексте с двойной кавычкой строки, в то время как T_CONSTANT… строки часто сбиваются с помощью простых выражений или утверждений PHP.
Неверная переменная интерполяция И это чаще всего встречается при некорректной интерполяции переменных PHP: Цитирование ключей массивов является обязательным в контексте PHP. Но в двойных кавычках (или HEREDOC) это ошибка. Парсер жалуется на содержащуюся в одиночном кавычке , потому что обычно он ожидает там литерального идентификатора/ключа. Точнее, это справедливо для использования стиле PHP2 для ссылок на массивы: Вложенные массивы или более глубокие ссылки на объекты, однако, требуют синтаксиса синтаксиса: Если вы не уверены, это обычно безопаснее использовать. Он часто даже считается более читаемым. И лучшие IDE на самом деле используют для этого разную синтаксическую раскраску.
Отсутствует конкатенация Если строка следует за выражением, но не имеет конкатенации или другого оператора, то вы увидите, что PHP жалуется на строковый литерал: Хотя это очевидно для вас и меня, PHP просто не может догадаться, что строка должна быть добавлена туда.
Сбивающие с толку строковые кавычки Такая же синтаксическая ошибка возникает при смешивании строковых разделителей. Строка запускается один или двойной цитаты и заканчивается тем же. Этот пример начинался с двойных кавычек. Но двойные кавычки также предназначались для атрибутов HTML. Предполагаемый оператор конкатенации внутри, однако, интерпретировался как часть второй строки в одинарных кавычках. Это хороший пример, когда вы не должны выходить из двойных кавычек в первую очередь
Вместо этого просто используйте правильные для атрибутов HTML-атрибутов»: Хотя это также может привести к путанице в синтаксисе, все лучшие IDE/редакторы снова помогают раскрасить экранированные кавычки по-разному.
Здесь станет строковым литералом после голого слова, когда, очевидно, должен быть строковым параметром.
Обратите внимание, что в последней строке всегда может содержаться дополнительная запятая, но игнорировать одно между ними непростительно. Это трудно обнаружить без подсветки синтаксиса.
То же самое для вызовов функций:
Беглые строки Общим вариантом являются довольно просто забытые терминаторы строк: Здесь PHP жалуется на два строковых литерала, непосредственно следуя друг за другом
Но настоящая причина — незакрытая предыдущая строка, конечно.
Неожиданный T_VARIABLE
«Неожиданное » означает, что существует буквальное имя, которое не вписывается в текущую структуру выражений / операторов.
Это чаще всего указывает на отсутствующую точку с запятой в предыдущей строке
Переменные присваивания, следующие за заявлением, являются хорошим показателем, на который следует обратить внимание:
Кстати, вы должны предпочесть (базовые переменные в двойных кавычках), когда это помогает читаемости. Это позволяет избежать этих синтаксических проблем.
PHP не может угадать здесь, если переменная должна быть добавлена, вычтена или сравнена и т
Д.
Списки
То же самое для списков синтаксиса, например, в массивах, где парсер также указывает ожидаемую запятую, например:
Или списки параметров функций:
Эквивалентно вы видите это с помощью или инструкциями или при отсутствии точки с запятой в цикле.
Объявления классов
Эта ошибка парсера также встречается в объявлениях классов . Вы можете назначать только статические константы, а не выражения. Таким образом, парсер жалуется на переменные в качестве назначенных данных:
В частности, здесь могут быть непревзойденные фигурные скобки. Если метод заканчивается слишком рано (используйте правильный отступ!), Тогда блуждающая переменная обычно неправильно помещается в тело объявления класса.
Кстати, это распространенный пример, когда, возможно, предполагалось использовать переменные переменные . В этом случае поиск свойства переменной, например.
Решение: добавьте отсутствующее открытие между оператором и переменной.
Решение. Измените условия или используйте их ? ?
echo «Здесь возникает $ wrong access» ; .php «rel =» noreferrer «> .
Решение. Добавьте скобки вокруг .
Невидимые пробелы
Как упоминалось в справочном ответе «Невидимый бездомный Юникод» (например, неразрывное пространство ), вы также можете увидеть эту ошибку для ничего не подозревающего кода:
Это довольно распространено в начале файлов и для копирования и вставки кода. Проверьте с помощью шестнадцатеричного кода, если ваш код визуально не содержит синтаксическую проблему.
Описания синтаксиса языков семейства Си
Си (англ. C) — стандартизированный процедурный язык программирования, разработанный в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи как развитие языка Би. Си был создан для использования в операционной системе UNIX. С тех пор он был портирован на многие другие операционные системы и стал одним из самых используемых языков программирования. Си ценят за его эффективность; он является самым популярным языком для создания системного программного обеспечения. Его также часто используют для создания прикладных программ. Несмотря на то, что Си не разрабатывался для новичков, он активно используется для обучения программированию. В дальнейшем синтаксис языка Си стал основой для многих других языков.
Для языка Си характерны лаконичность, современный набор конструкций управления потоком выполнения, структур данных и обширный набор операций.
В знаменитой книге Б. Кернигана и Д. Ритчи описание синтаксиса языка Си дано
в нотации, которая эквивалентна БНФ, но использует другие соглашения об обозначениях терминалов и нетерминалов, альтернативных правых частей правил,
необязательных конструкций.
Нетерминалы записываются курсивом, терминалы — прямым шрифтом. Альтернативные части правил выписываются в столбик по одному в строке или помечаются
словами «one of» (один из). Необязательные части сопровождаются подстрочным
индексом «opt (от optional) — необязательный; «необ» — в некоторых русских пере-
водах). Левая часть правила записывается отдельной строкой с отступом влево.
Вот пример определений конструкций языка Си:
составной оператор {список описанийopt список операторовopt } список операторов оператор оператор список операторов
Как видим, из-за отсутствия явного способа выражения повторений, определе-
ния изобилуют рекурсией.
Аналогичная нотация с минимальными изменениями использована для описа-
ния синтаксиса языков-потомков Си: Си++, Ява, Си#. Вот выдержка из стандарта
ЕСМА-334 на язык Си#:
block: {Statement-listopt} statement-list: statement statement-list statement
Специального названия эта нотация, судя по всему, не имеет. И представляется, как минимум, странной. Она неудобна не только для чтения, но и для обработки на компьютере. Ее использование при описании новых языков трудно объяснить чем-либо, кроме дурно понятой необходимости следовать традициям.
Неожиданное эхо «Использовать {$ array [‘as_usual’]} с фигурным синтаксисом.» ; Неожиданный T_ENCAPSED_AND_WHITESPACE
Громоздкие имена и ссылки на цитируемые литералы .
Они используются в разных контекстах, но проблема синтаксиса весьма схожа. Предупреждения T_ENCAPSED … встречаются в контексте с двойными кавычками , а строки T_CONSTANT … часто сбиваются с помощью простых выражений или операторов PHP.
Неверная переменная интерполяция
И это чаще всего встречается при некорректной интерполяции переменных PHP:
Цитирование ключей массивов является обязательным в контексте PHP. Но в двойных кавычках (или HEREDOC) это ошибка. Парсер жалуется на содержащиеся в одиночном кавычки , потому что он обычно ожидает литеральный идентификатор / ключ.
Точнее, это справедливо для использования стиле PHP2 для ссылок на массивы:
Вложенные массивы или более глубокие ссылки на объекты, однако, требуют синтаксиса синтаксиса:
Если вы не уверены, это обычно безопаснее использовать. Его часто считают более читаемым. И лучшие IDE на самом деле используют для этого разную синтаксическую раскраску.
Отсутствует конкатенация
Если строка следует за выражением, но не имеет конкатенации или другого оператора, то вы увидите, что PHP жалуется на строковый литерал:
Хотя это очевидно для вас и меня, PHP просто не может догадаться, что строка должна быть добавлена ??туда.
Сбивающие с толку строковые кавычки
Такая же синтаксическая ошибка возникает при смешивании строковых разделителей . Строка, начинающаяся с одной или двойной кавычки, также заканчивается тем же.
Этот пример начинался с двойных кавычек. Но двойные кавычки также предназначались для атрибутов HTML. Предполагаемый оператор конкатенации внутри, однако, интерпретировался как часть второй строки в одинарных кавычках.
Это хороший пример, когда вы не должны выходить из двойных кавычек в первую очередь
Вместо того, чтобы просто использовать правильные побеги для HTML атрибутов? кавычки:
Хотя это также может привести к путанице в синтаксисе, все лучшие IDE / редакторы снова помогают раскрасить экранированные кавычки по-разному.
Здесь он станет строковым литералом после голого слова, когда, очевидно, должен быть строковый параметр.
Списки массивов
Если вы пропустите запятую в блоке создания массива, синтаксический анализатор увидит две последовательные строки:
Обратите внимание, что в последней строке всегда может содержаться дополнительная запятая, но игнорировать одно между ними непростительно. Это трудно обнаружить без подсветки синтаксиса.
То же самое для вызовов функций :
Беглые строки
Общим вариантом являются довольно просто забытые терминаторы строк:
Здесь PHP жалуется на два строковых литерала, непосредственно следуя друг за другом
Но настоящая причина — незакрытая предыдущая строка, конечно.
Замыкания
Замыкания ДОЛЖНЫ быть объявлены с пробелом после ключевого слова , и пробелом перед и после ключевого слова .
Открывающая фигурная скобка ДОЛЖНА идти на той же строке, а закрывающая фигурная скобка ДОЛЖНА идти на следующей строке после тела функции.
НЕ ДОЛЖНО быть пробела после открывающей круглой скобки списка аргументов или списка переменных, и НЕ ДОЛЖНО быть пробела перед закрывающей круглой скобкой списка аргументов или списка переменных.
В списке аргументов и списке переменных НЕ ДОЛЖНО быть пробела перед каждой запятой, и ДОЛЖЕН быть один пробел после каждой запятой.
Аргументы замыкания со значениями по умолчанию должны идти в конце списка аргументов.
Объявление замыкания выглядит следующим образом
Обратите внимание на размещение круглых скобок, запятых, пробелов и фигурных скобок:. Список аргументов и список переменных МОЖЕТ быть разделен на несколько строк, где каждая последующая строка с одним отступом
При этом первый элемент в списке ДОЛЖЕН быть на следующей строке, и ДОЛЖЕН быть только один аргумент или переменная на строку
Список аргументов и список переменных МОЖЕТ быть разделен на несколько строк, где каждая последующая строка с одним отступом. При этом первый элемент в списке ДОЛЖЕН быть на следующей строке, и ДОЛЖЕН быть только один аргумент или переменная на строку.
Когда конечный список (или аргументов или переменных) разделен на несколько строк, закрывающая круглая скобка и открывающая фигурная скобка ДОЛЖНЫ быть установлены вместе на их собственную строку с одним пробелом между ними.
Ниже приведены примеры замыканий с и без списка аргументов и списка переменных разбитого на несколько строк.
Обратите внимание, что правила форматирования применяются также когда замыкание используется прямо как аргумент при вызове метода или функции