Phpstorm 2019.3: поддержка php 7.4, psr-12, wsl, mongodb и многое другое

Содержание

Модель исключений (exceptions) в PHP похожа с используемыми в других языках программирования. Исключение можно сгенерировать (выбросить) при помощи оператора throw, и можно перехватить (поймать) оператором . Код генерирующий исключение, должен быть окружен блоком try, для того, чтобы можно было перехватить исключение. Каждый блок try должен иметь как минимум один соответствующий ему блок или .

Генерируемый объект должен принадлежать классу Exception или наследоваться от Exception. Попытка сгенерировать исключение другого класса приведет к фатальной ошибке PHP.

catch

Можно использовать несколько блоков , перехватывающих различные классы исключений. Нормальное выполнение (когда не генерируются исключения в блоках try) будет продолжено за последним блоком . Исключения могут быть сгенерированы (или вызваны еще раз) оператором throw внутри блока .

При генерации исключения код, следующий после описываемого выражения, не будет выполнен, а PHP попытается найти первый блок , перехватывающий исключение данного класса. Если исключение не будет перехвачено, PHP выдаст фатальную ошибку: «Uncaught Exception …» (Неперехваченное исключение), если не был определен обработчик ошибок при помощи функции set_exception_handler().

В PHP 7.1 и выше, блок может принимать несколько типов исключений с помощью символа (|). Это полезно, когда разные исключения из разных иерархий классов обрабатываются одинаково.

finally

В PHP 5.5 и более поздних версиях блок также можно использовать после или вместо блока . Код в блоке всегда будет выполняться после кода в блоках try и , независимо от того, было ли выброшено исключение, перед тем как продолжится нормальное выполнение кода.

Одно важное взаимодействие происходит между блоком и оператором return. Если оператор return встречается внутри блоков try или , блок все равно будет выполнен. Кроме того, оператор return выполняется, когда встречается, но результат будет возвращен после выполнения блока . Если блок также содержит оператор return, возвращается значение, указанное в блоке .. Подсказка

Подсказка

Стандартная библиотека PHP (SPL) предоставляет хороший набор встроенных классов исключений.

Примеры

Пример #3 Выбрасывание исключений


Результат выполнения данного примера:

0.2
Выброшено исключение: Деление на ноль.
Привет, мир

Пример #4 Обработка исключений с помощью блока

Результат выполнения данного примера:

0.2
Первый блок finally.
Поймано исключение: Деление на ноль.
Второй блок finally.
Привет, мир

Пример #5 Взаимодействие между блоками и return

Результат выполнения данного примера:

finally

Пример #6 Вложенные исключения

Результат выполнения данного примера:

string(4) "foo!"

Пример #7 Обработка нескольких исключений в одном блоке catch

Результат выполнения данного примера:

string(11) "MyException"

PHP 7.4: типизированные свойства

PHP 7.4 обещает быть самым крутым и богатым на новые возможности релизом со времен PHP 7.0! Посмотрите на все принятые в нем RFC.

Самая ожидаемая фича это, конечно же, типизированные свойства, и PhpStorm 2019.2 уже полностью их поддерживает! Включая подсветку, вывод и резолв типов, а также всевозможные проверки.

Если вы попытаетесь положить в свойство что-то не то — PhpStorm сразу об этом предупредит.

А вот чтобы подготовиться к миграции на PHP 7.4, который выйдет в конце ноября, в PhpStorm есть быстрые фиксы. Для объявления типа можно нажать на свойстве без типа и выбрать Add declared type for the field. PhpStorm определит тип свойства на основе информации в PHPDoc, дефолтном значении или декларации типа аргумента, если свойство внедряется через конструктор.

Оператор ??= (null coalesce assign)

Новый короткий оператор присваивания с проверкой на null довольно удобен в случае громоздких выражений.

В PhpStorm, само собой, поддерживается синтаксис, но еще есть быстрый фикс для того, чтобы заменить там, где это возможно:

Оператор распаковки (…) в массивах

PHP поддерживает распаковку аргументов с помощью оператора еще с версии 5.6. В предстоящем релизе PHP оператор можно будет использовать и в массивах:

PhpStorm проанализирует использование оператора на корректность и удостоверится, что вы распаковываете только массивы или объекты Traversable и не пытаетесь по ошибке сделать что-то не поддерживаемое интерпретатором PHP:

Now, onto your question!

Since with mod_php, PHP gets loaded right into Apache, if Apache is going to handle concurrency using its Worker MPM (that is, using Threads) then PHP must be able to operate within this same multi-threaded environment — meaning, PHP has to be thread-safe to be able to play ball correctly with Apache!

At this point, you should be thinking «OK, so if I’m using a multi-threaded web server and I’m going to embed PHP right into it, then I must use the thread-safe version of PHP». And this would be correct thinking. However, as it happens, PHP’s thread-safety is highly disputed. It’s a use-if-you-really-really-know-what-you-are-doing ground.

Thread-Safe Resource Manager

When PHP is built with Thread Safety enabled, the engine requires a way to isolate contexts from one another, such that the threads of a process may service individual requests without interference. TSRM is omnipotent within PHP, extension authors have to do very little in order to make sure their extensions can function in both a Thread Safe and Non Thread Safe architecture.

Example #1 Accessor macros for per-module globals

#ifdef ZTS
#define COUNTER_G(v) TSRMG(counter_globals_id, zend_counter_globals *, v)
#else
#define COUNTER_G(v) (counter_globals.v)
#endif

The snippet above shows how an extension author is expected to define their global accessors. The TSRMG macro takes an identifier, type cast and element name. The identifier is assigned by TSRM during initialization of the module. Declaring global accessors in this way ensures that an extension can operate safely in a Thread Safe and Non Thread Safe architecture using the same logic.

TSRM manages the isolation and safety of all global structures within PHP, from executor globals to extension globals, a pointer to the isolated storage is also passed around with most, or many of the API functions. The macros TSRMLS_C and TSRMLS_CC translate to «thread safe local storage» and «thread safe local storage prefixed with a comma» respectively.

If a function requires a pointer to TSRM, it is declared with the macro TSRMLS_D or TSRMLS_DC in it’s prototype, which translates to «thread safe local storage only» and «thread safe local storage prefixed with a comma» respectively. Many macros within the engine reference TSRM, so it is a good idea to declare most things to accept TSRM, such that if they need to call upon TSRM they do not have to fetch a pointer during execution.

Because TSRM is thread local, and some functions (for compatibility reasons) are not able to accept TSRM directly, the macro TSRMLS_FETCH exists, which requests that TSRM fetches the pointer to the thread local storage. This should be avoided wherever it can be, as it is not without cost in a Thread Safe setup.

The functionality documented hereafter is aimed at advanced use of TSRM. It is not ordinary for extensions to have to interact with TSRM directly, the pecl programmer should use API’s above TSRM such as the Module Globals API.

TSRM Internals
Prototype Description
The type definition to represent a resource by numeric identifiers
and are not hard limits. and only have an effect on windows in Debug mode or when TSRM_DEBUG is defined. Called once per process in ZTS mode during server startup.
Should be the last thing called in the process to destroy and free all storage TSRM storage in ZTS mode.
Allocates and thread safe pointer of bytes, calling on the pointer, assigning (and returning) the id to , the is called when the resource is free’d. Module globals are isolated in ZTS mode using this API.
Fetches a resource by previously allocated from the entries created by the specified thread identifed by .
Fetches a resource by previously allocated from the entries created by the calling thread.
Destroys and frees the entries for the calling thread, currently this API is only used by ISAPI module.
Destroys the resource identified by previously allocated . Module globals are cleaned up in ZTS mode using this API.
TSRM Mutex API
Prototype Description
Allocates and returns a suitable MUTEX_T for the environment.
Locks for the calling thread.
Unlocks for the calling thread.
Destroys and frees the (unlocked) and previously allocated .

Внешний вид

Можно включить отображение размера и даты изменения файлов в Project View с помощью View -> In-place Descriptions.

Новый вид всплывающей подсказки для инспекций

Всплывающая подсказка теперь не только описывает проблему, но и предлагает первый фикс из списка. Чтобы применить его мгновенно, даже без подсказки и клика, нажмите . Чтобы посмотреть все доступные фиксы, нажмите .

Обновленный UI на Windows

Свежий безрамочный вид на Windows 10:

PhpStorm, как всегда, включает в себя все обновления из WebStorm и из DataGrip. А полный список изменений можно найти в очень больших release notes.


И, напоследок, короткий ролик (на английском) с демонстрацией главных фич релиза:

Ваша команда JetBrains PhpStorm

Редактор

Дополнение кода при опечатках

Если вдруг вы написали или вместо — не страшно, потому что дополнение все равно сработает, так как распознает такого рода опечатки.

Это работает во всех языках и для всех символов — ключевых слов, классов, функций, свойств, методов и т. д.

Конфигурация поведения ‘Move Caret to Next Word’

Можно выбрать, куда будет ставиться указатель при перемещении по словам.Смотрите раздел Caret Movement в Preferences | Editor | General.

<

Перемещение за скобки и кавычки при нажатии Tab

Старая фишка теперь включена по умолчанию. Когда вы печатаете и нажимаете Tab, вместо добавления символа табуляции ваш курсор переместится за пределы кавычек и скобок. Чтобы отключить эту возможность, уберите галочку Jump outside closing bracket/quote with Tab when typing в разделе настроек Preferences | Editor | General | Smart Keys.

Выделенный код оборачивается в кавычки или скобки автоматически

Еще одна суперполезная фишка теперь включена по умолчанию. Когда вы нажимаете кавычку (или скобку), выделив кусок кода, то в начале и конце выделения автоматически будут добавлены кавычки (или скобки).

Если такое поведение вам не по душе, его можно отключить галочкой Surround selection on typing quote or brace в разделе Preferences | Editor | General | Smart Keys.

Новая раскладка по умолчанию на macOS

Мы поменяли дефолтную раскладку на macOS с Mac OS X на macOS 10.5+. Еще мы переименовали раскладки: Mac OS X 10.5 теперь называется Default for macOS, а старая Mac OS X теперь IntelliJ IDEA Classic.

Multiprocessing

You can achieve parallel computing by creating new processes (that also contain a new thread) with php. If your threads do not need much communication or synchronization, this is your choice, since the processes are isolated and cannot interfere with each other’s work. Even if one crashes, that doesn’t concern the others. If you do need much communication, you should read on at «multithreading» or — sadly — consider using another programming language, because inter-process communication and synchronization introduces a lot of complexion.

In php you have two ways to create a new process:

let the OS do it for you: you can tell your operation system to create a new process and run a new (or the same) php script in it.

  • for linux you can use the following or consider :

  • for windows you may use this:

do it yourself with a fork: php also provides the possibility to use forking through the function pcntl_fork(). A good tutorial on how to do this can be found here but i strongly recommend not to use it, since fork is a crime against humanity and especially against oop.

PHP в режиме CGI

PHP в режиме CGI это самый старый способ выполнения php-скриптов веб-сервером. Режим доступен по умолчанию, однако может быть отключён при компиляции. Для Apache нужен модуль (поставляется вместе с Apache). Nginx из коробки поддержки не имеет, хотя существуют дополнительные инструменты. В данный момент режим используется редко в силу малой производительности.

Common Gateway Interface — это стандарт, который описывает, как веб-сервер должен запускать прикладные программы (скрипты), как должен передавать им параметры HTTP-запроса, как программы должны передавать результаты своей работы веб-серверу. Прикладную программу взаимодействующую с веб-сервером по протоколу CGI принято называть шлюзом, хотя более распространено название CGI-скрипт или CGI-программа.

В качестве CGI-программ могут использоваться программы/скрипты написанные на любых языках программирования, как на компилируемых, так и на скриптовых, и даже на shell. CGI-скрипты были популярны до того, как для веб-разработки стали преимущественно использовать PHP.

Настройка файла php.ini

Для удобства ориентирования мы разобьем все параметры по категориях в зависимости от их назначения. Вам будет достаточно найти нужный параметр и изменить его значение. А теперь откройте файл настроек php, например, для модуля apache и перейдем к настройке. Чтобы избежать ошибок не добавляйте новые строки, а ищите уже существующие и изменяйте значения на нужные:

Сначала идет немного информации о самом файле в виде комментариев, затем интересующие нас настройки.

Вывод ошибок в php

Настройка php 7 обычно начинается с конфигурации вывода ошибок. Все настройки вывода ошибок находятся в разделе Error handling and logging. По умолчанию вывод ошибок на экран во время выполнения скрипта отключен. Это сделано для того, чтобы пользователи не смогли увидеть ничего лишнего. Вместо этого, все ошибки записываются в лог файл. Если вы используете php на домашнем компьютере, то такие меры не нужны и вы можете сразу выводить все на экран:

Замените off на on. В php используются различные типы ошибок, например, критические, предупреждения, ошибки синтаксиса, с помощью строки error_reporting вы можете включить вывод только определенных типов ошибок:

Если нужно объединить несколько типов ошибок, то используйте символ &, а для отключения отображения поставьте перед типом знак ~. Приведенный выше пример отображает все ошибки (E_ALL), кроме сообщений об устаревших функциях (E_DEPRECATED). Вы можете отключить все типы использовав 0:

Включите запись ошибок php в лог файл, если не выводите их на экран:

Чтобы не засорять лог однотипными сообщениями можно игнорировать повторяющиеся ошибки в пределах одного исполнения:

Ограничения ресурсов

Если бы скрипты php никак не ограничивались в ресурсах, то они запросто могли бы перегрузить сервер и не дать ему нормально работать. Поэтому, по умолчанию php устанавливает жесткие ограничения, но, возможно, вам нужно будет их немного ослабить.


По умолчанию максимальное время выполнения скрипта — 30 секунд, сделаем минуту:

Если указать 0, то скрипт может выполняться бесконечно. Вы также можете ограничить время, на протяжении которого скрипт будет загружать данные, 60 секунд:

Максимальное количество переменных в GET и POST:

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

Максимальный размер данных, передаваемых в POST запросе тоже ограничивается, размер по умолчанию — 8 Мегабайт:

Вы можете ограничить область действия php в системе с помощью опции openbase_dir, она указывает папку, выше которой скрипт не может получить доступ к файловой системе:

С помощью директив disable_functions и disable_classes вы можете отключить использование в скриптах определенных функций или классов, например, это может быть полезно для веб-хостингов. В этом примере мы отключаем использование функции ini_set, которая позволяет менять настройки php из скрипта:

Директории по умолчанию

Файл настройки php.ini позволяет указать пути в файловой системе по умолчанию для различных действий. Вы можете задать папки где система будет искать скрипты, если вы попытаетесь подключить их с помощью инструкции include:

Папка с модулями php:

Папка для записи временных файлов:

Загрузка файлов

Для того чтобы пользователи могли загружать свои файлы на сервер, например, фото, нужно включить эту функцию в php:

Максимальный размер загружаемого файла:

Максимальное количество файлов, которые может загрузить один скрипт:

Настройка php.ini практически завершена, нам остались лишь расширения.

Настройка расширений

Расширения позволяют очень сильно увеличить функциональность php. Например, благодаря расширениям вы можете использовать в своих скриптах базы данных mysql, postgresql, mysqli, sqlite, графическую библиотеку gd и многое другое. Все это включается в этом разделе.

Для включения расширения достаточно убрать комментарий перед строкой с его командой, например:

Обратите внимание, что для windows расширение будет иметь формат dll, но для linux нужно использовать so. В следующих секциях идет настройка каждого из расширений, но мы их рассматривать не будем потому что они обычно не требуют настройки

Поддержка формата PHPT

Хотели бы контрибьютить в сам PHP и присоединиться к PHP Internals? Лучший способ — начать с документации и тестов! К счастью, для этого нет необходимости знать C. Тесты для PHP пишутся в специальных файлах .phpt. По сути, это текстовый файл, разбитый на несколько секций, некоторые из которых могут содержать PHP-код.

Так вот, в PhpStorm 2019.2 есть и поддержка phpt-файлов! Секции подсвечиваются, PHP и INI автоматически внедряются там где нужно, работают переходы на внешние файлы в соответствующих секциях.

Больше информации о написании тестов для PHP есть тут: PHP TestFest Tutorials, PHP Internals Book и qa.php.net.

Развитие производительности PHP

  • Версия 5.1, в которой мы смогли существенно повысить скорость интерпретации. Мы реализовали специализирующий интерпретатор, и это повлияло в первую очередь на синтетические тесты.
  • Версия 7.0, в которой переработали все ключевые структуры данных и таким образом оптимизировали работу с памятью и кэшем процессора (подробнее об этих оптимизациях читайте здесь). Это привело к более чем двукратному ускорению и на синтетических тестах, и в реальных приложениях.

статьярассказывал

PHP + OPcache

  • execute_data — указатель на текущий фрейм активации;
  • opline — указатель на текущую исполняемую виртуальную инструкцию.

PHP + OPcache + JIT

Установка PHP

Последним компонентом в настройке рабочего окружения станет PHP.

В окне терминала введите команду для установки из репозитория.

sudo apt install php-fpm php-cli php-common php-json php-mysql php-phpdbg php-mbstring php-imap php-dev php-curl php-xdebug

Важно: обязательно обратите внимание на устанавливаемую версию. В зависимости от дистрибутива она может отличаться. Например, в Ubuntu 16.04 устанавливается 7.0

Если номер версии отличается от той, что мы указали в конфигурационном файле , то необходимо её исправить

Например, в Ubuntu 16.04 устанавливается 7.0. Если номер версии отличается от той, что мы указали в конфигурационном файле , то необходимо её исправить.

Final notes

In case you are wondering, my personal advice would be to not use PHP in a multi-threaded environment if you have the choice!


Speaking only of Unix-based environments, I’d say that fortunately, you only have to think of this if you are going to use PHP with Apache web server, in which case you are advised to go with the prefork MPM of Apache (which doesn’t use threads, and therefore, PHP thread-safety doesn’t matter) and all GNU/Linux distributions that I know of will take that decision for you when you are installing Apache + PHP through their package system, without even prompting you for a choice. If you are going to use other webservers such as nginx or lighttpd, you won’t have the option to embed PHP into them anyway. You will be looking at using FastCGI or something equal which works in a different model where PHP is totally outside of the web server with multiple PHP processes used for answering requests through e.g. FastCGI. For such cases, thread-safety also doesn’t matter. To see which version your website is using put a file containing on your site and look for the entry. This could say something like or .

If you also look at the command-line version of PHP — thread safety does not matter.

Установка на Linux

Настроить рабочее окружение для разработки на PHP в Linux возможно несколькими способами. Рассмотрим один из наиболее быстрых способов: настройка связки PHP плюс nginx.

Запустите приложение «Терминал». Ярлык на запуск доступен в менеджере приложений.

Рисунок 1. Окно терминала

Обновим локальный индекс пакетов APT sudo apt-get update

Для работы с PHP нам потребуется веб-сервер. В репозиториях доступно несколько популярных веб-серверов, мы отдадим предпочтение nginx. Помимо высокой производительности его легче конфигурировать. sudo apt-get install nginx

Следующим шагом выполним запуска nginx. Запомните эту команду. Она вам пригодится при добавлении новых виртуальных хостов.

sudo service nginx start

nginx установлен и теперь нам требуется выполнить базовое конфигурирование. Наша цель — создать новый виртуальный хост, который будет доступен по адресу , где вместо может быть название вашего проекта. Например: ,

Обратите внимание, имена доменов не могут содержать пробелы. Определитесь с именем домена (далее «имя хоста для проекта»)

Мы будем ориентироваться на проект , поэтому именно так будем называть конфигурационный файл.

Перейдите в директорию . В этой директории, nginx хранит конфигурационные файлы всех виртуальных хостов.

cd /etc/nginx/sites-available

Чтобы увидеть список всех доступных виртуальных хостов, выведите содержимое каталога:

ls -all

Рисунок 2. Список доступных виртуальных хостов

Название конфигурационного файла должно совпадать с именем хоста. Поскольку мы планируем сделать конфигурационный файл для хоста , нам потребуется создать файл . Сделаем это:

sudo touch yeticave.local

Файл готов, теперь откроем его в консольном редакторе nano (установлен по умолчанию в большинстве современных дистрибутивов) и опишем минимальную конфигурацию.

sudo nano yeticave.local

Скопируйте в открытый файл ниже приведённый конфигурационный файл. Информацию обо всех непонятных строках вы сможете почерпнуть из официальной документации к nginx. server {

# Наш проект будет доступен на 80 порту listen 80;

# Имя виртуального хоста server_name yeticave.local;

# Корневая директория проекта. В этой папке будут находиться файлы проекта. # Обратите внимание. Файлы находятся в домашней директории пользователя # Administrator. Ваше имя наверняка отличается, поэтому обратите на это внимание # при написании пути. root /home/administrator/www/yeticave.local;

# Имя индексного файла. index index.php;

# Настройки отдачи файлов

location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ { access_log off; expires max; log_not_found off; }

location / { try_files $uri $uri/ /index.php?$query_string; }

location ~* \.php$ { try_files $uri = 404; fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Обратите внимание на номер версии PHP. На текущей момент в репозиториях # Ubuntu доступна версия 7.1. Если вы пользуетесь более старой версии ОС, # то не забудьте обновить номер версии на свой.

fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }

location ~ /\.ht { deny all; } }

Рисунок 3. Подготовка конфига

Для сохранения изменений в файле нажмите комбинацию клавиш ctrl + o. Затем закройте редактор nano сочетанием клавиш ctrl + x.

Протестируем созданный конфигурационный файл на наличие ошибок:

sudo nginx -t

Рисунок 4. Тестирование конфигурационного файла nginx

На этом процесс создания конфигурационного файла завершён. Активируем только что созданный виртуальный хост. Для этого перейдём в директорию и создадим в ней символическую ссылку на наш конфигурационный файл. cd /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/yeticave.local

Если на текущем шаге попытаться открыть браузер и ввести в адресной строке , то ничего, кроме ошибки «Сервер не найден», мы не увидим. Исправим проблему добавлением новой записи в : sudo nano /etc/hosts

В самом начале файле добавьте строку:

127.0.0.1 yeticave.local

Обратите внимание, мы пишем только доменное имя без указания протокола (http). Сохраняем изменения ctrl + o и закрываем редактор nano сочетанием клавиш ctrl + x .

Области применения CGI¶

Наиболее частая задача, для решения которой применяется CGI — создание интерактивных страниц, содержание которых зависит от действий пользователя. Типичными примерами таких веб-страниц является форма регистрации на сайте или форма для отправки комментария. Другая область применения CGI, остающаяся за кулисами взаимодействия с пользователем, связана со сбором и обработкой информации о клиенте: установка и чтение «печенюшек»-cookies; получение данных о браузере и операционной системе; подсчет количества посещений веб-страницы; мониторинг веб-трафика и т.п.

Это обеспечивается возможностью подключения CGI-скрипта к базе данных, а также возможностью обращаться к файловой системе сервера. Таким образом CGI-скрипт может сохранять информацию в таблицах БД или файлах и получать ее оттуда по запросу, чего нельзя сделать средствами HTML.


С этим читают