Статья перепечатана с:learnku.com/php/t/21549
PHP по-прежнему является сильным конкурентом других языков сценариев, в основном из-за быстрых обновлений его основной команды поддержки.
С момента выпуска PHP 7.0 сообщество стало свидетелем появления множества новых функций, которые значительно улучшают использование PHP разработчиками в своих проектах. Повышение производительности и безопасности приложений PHP является основной целью этих улучшений.
PHP недавно достиг еще одной вехи -Выпуск PHP 7.3. Новая версия содержит несколько столь необходимых обновлений.
В этой статье я расскажу о недавно представленномВозможности PHP 7.3и обновить. Хорошей новостью является то, что вы можете самостоятельно установить новую версию на свой тестовый сервер и проверить новые функции. Но как клише, никогда не обновляйте версии RC на рабочих серверах, это может сломать ваше уже работающее приложение.
Ниже приведены некоторые обновления, представленные в версии 7.3, которые значительно улучшают производительность по сравнению с предыдущими версиями.Производительность PHP 7.3.
- Гибкий синтаксис Heredoc и Nowdoc
- Запятые в конце разрешены в вызовах функций
- JSON_THROW_ON_ERROR
- Миграция PCRE2
- ссылка на назначение list()
- is_countable функция
- array_key_first(), array_key_last()
- Усовершенствования хеширования паролей Argon2
- Устарело и удалено image2wbmp()
- Устаревание и удаление констант без учета регистра
- Файлы cookie того же сайта
- обновление FPM
- Улучшено удаление файлов под Windows
Давайте обсудим каждое из вышеперечисленных обновлений один за другим.
Гибкий синтаксис Heredoc и Nowdoc
Heredoc иNowdocСинтаксис может быть очень полезен при работе с длинными многострочными строками. Требуется, чтобы закрывающий идентификатор был первой строкой, которая появляется в новой строке.
// 除了这样:
$query = <<<SQL
SELECT *
FROM `table`
WHERE `column` = true;
SQL;
// 这样也可以:
$query = <<<SQL
SELECT *
FROM `table`
WHERE `column` = true;
SQL;
В целом, это обновление предлагает два улучшения, а именно:
- Поддержка отступов перед закрытием идентификаторов
- Больше не принудительно переводить строку после закрытия идентификатора
В приведенном выше примере эти изменения легко увидеть.
Запятые в конце разрешены в вызовах функций
Добавляет запятую в конце списка параметров, элементов и переменных. Иногда нам нужно передать большое количество элементов в массивах и вызовах функций (особенно функций с переменным числом аргументов), и если мы пропустим запятую, будет сообщено об ошибке. Ввиду описанной выше ситуации запятая в конце очень полезна. Эту функцию разрешено использовать внутри массивов, а начиная с PHP 7.2, группирование пространств имен (Grouped Namespaces
) синтаксис также начал поддерживать запятые в конце.
use Foo\Bar\{
Foo,
Bar,
};
$foo = [
'foo',
'bar',
];
Завершающие запятые полезны, когда здесь необходимо добавить новые значения. В вариационной функции, например.unset()
Внутри тем более.
unset(
$foo,
$bar,
$baz,
);
Кроме того, когда вы используетеcompact()
Пример использования функции при передаче пакета переменных в механизм шаблонов.
echo $twig->render(
'index.html',
compact(
'title',
'body',
'comments',
)
);
В некоторых случаях, когда необходимо построить непрерывные или сгруппированные данные, часто необходимо использоватьarray_merge()
Функция объединяет массивы. Также можно использовать завершающую запятую:
$newArray = array_merge(
$arrayOne,
$arrayTwo,
['foo', 'bar'],
);
Точно так же вы можете использовать эту функцию при вызове произвольных методов, функций и замыканий.
class Foo
{
public function __construct(...$args) {
//
}
public function bar(...$args) {
//
}
public function __invoke(...$args) {
//
}
}
$foo = new Foo(
'constructor',
'bar',
);
$foo->bar(
'method',
'bar',
);
$foo(
'invoke',
'bar',
);
JSON_THROW_ON_ERROR
Разберите данные ответа JSON, естьjson_encode()
так же какjson_decode()
Доступны две функции. К сожалению, ни один из них не имеет надлежащего поведения при выдаче ошибок.json_encode
вернется только в случае неудачиfalse
;json_decode
возвращается в случае неудачиnull
,а такжеnull
Может использоваться как допустимое значение JSON. Единственный способ получить ошибку - позвонитьjson_last_error()
илиjson_last_error_msg()
, который вернет машиночитаемый и человекочитаемый глобальный статус ошибки соответственно.
Решение, предложенное в этом RFC, состоит в том, чтобы добавить новую функцию JSON.JSON_THROW_ON_ERROR
Константа, используемая для игнорирования глобальных состояний ошибок. При возникновении ошибки функция JSON выдастJsonException
исключение, сообщение об исключении (message
)заjson_last_error()
возвращаемое значение, код исключения (code
)заjson_last_error_msg()
Возвращаемое значение. Ниже приведен пример вызова:
json_encode($data, JSON_THROW_ON_ERROR);
json_decode("invalid json", null, 512, JSON_THROW_ON_ERROR);
// 抛出 JsonException 异常
Обновление PCRE2
PHP использует PCRE в качестве механизма регулярных выражений. Но, начиная с PHP 7.3, PCRE2 станет новым обычным движком. Итак, вам необходимо перенести существующие регулярные выражения, чтобы они соответствовали правилам PCRE2. Эти правила более навязчивы, чем раньше. См. следующие примеры:
preg_match('/[\w-.]+/', '');
Это выражение не будет соответствовать новым версиям PHP без предупреждения. Поскольку PCRE2 теперь строго обязателен, для соответствия дефисам (-
) вместо диапазона его нужно переместить в конец или экранировать.
После обновления до PCRE2 10.x поддерживаются следующие и другие функции:
- относительная обратная ссылка
\g{+2}
(аналог существующего\g{-2}
) - проверка версии PCRE2
(?(VERSION>=x)...)
-
(*NOTEMPTY)
а также(*NOTEMPTY_ATSTART)
Скажите движку не возвращать пустые спички -
(*NO_JIT)
Отключить JIT-оптимизацию -
(*LIMIT_HEAP=d)
Ограничить размер кучи доd
KB -
(*LIMIT_DEPTH=d)
Установите ограничение глубины возврата наd
-
(*LIMIT_MATCH=d)
Установите лимит совпадений наd
Примечание переводчика: отечественная регулярная терминология различается, "обратная ссылка"—
Back References
, также известен как "обратная ссылка", "обратная ссылка" и т. д., обратитесь к китайскому переводу официального руководства по PHP здесь.
ссылка на назначение list()
list() в PHP теперь можно назначать ссылкам. В текущей версии присваивания в list() не могут использовать ссылки. В PHP 7.3 ссылки будут разрешены. Новый и улучшенный синтаксис выглядит следующим образом:
$array = [1, 2];
list($a, &$b) = $array;
эквивалентно
$array = [1, 2];
$a = $array[0];
$b =& $array[1];
В изменениях PHP 7.3 мы также можем вкладывать друг друга с помощью метода foreach().
$array = [[1, 2], [3, 4]];
foreach ($array as list(&$a, $b)) {
$a = 7;
}
var_dump($array);
is_countable функция
В PHP 7.2 используйте count() для получения количества объектов и массивов. PHP выдаст предупреждение ⚠️, если объект не поддается счету. Поэтому вам нужно проверить, является ли объект или массив счетным. PHP 7.3 предоставляет новую функцию is_countable() для решения этой проблемы.
Этот RFC предоставляет новую функцию is_countable() для типов массивов или реализации.Countable
Переменные, являющиеся экземплярами интерфейса, возвращают значение true .
До:
if (is_array($foo) || $foo instanceof Countable) {
// $foo 是可数的
}
Позже:
if (is_countable($foo)) {
// $foo 是可数的
}
array_key_first(), array_key_last()
Текущая версия PHP позволяет использоватьreset()
,end()
а такжеkey()
и другие методы получения ключей и значений в начале и конце массива путем изменения внутреннего указателя массива. Теперь, чтобы избежать этого внутреннего вмешательства, в PHP 7.3 представлены новые функции для решения этой проблемы:
-
$key = array_key_first($array);
Получить ключевое имя первого элемента массива -
$key = array_key_last($array);
Получить ключевое имя последнего элемента массива
Давайте посмотрим пример:
// 关联数组的用法
$array = ['a' => 1, 'b' => 2, 'c' => 3];
$firstKey = array_key_first($array);
$lastKey = array_key_last($array);
assert($firstKey === 'a');
assert($lastKey === 'c');
// 索引数组的用法
$array = [1 => 'a', 2 => 'b', 3 => 'c'];
$firstKey = array_key_first($array);
$lastKey = array_key_last($array);
assert($firstKey === 1);
assert($lastKey === 3);
Примечание переводчика:
array_value_first()
а такжеarray_value_last()
RFC не проголосовал за него, поэтому представлен только в PHP 7.3.array_key_first()
так же какarray_key_last()
функция. Ссылка на ссылку:wiki.PHP.net/RFC/массив_доступный…
Повышение производительности шифрования Argon2 и Hash.
В более ранних версиях PHP мы добавили Argon2 и алгоритм шифрования хэшированных паролей, современный алгоритм, который использует алгоритм хеширования для защиты паролей. Он бывает трех разных типов: Argon2i, Argon2d и Argon 2id. Мы оптимизируем хэширование паролей Argon2i и генерацию ключей на основе паролей. Argon2d работает быстрее и использует доступ к данным, зависящий от памяти. Argon2i использует независимый от памяти доступ к данным. Argon2id представляет собой гибрид Argon2i и Argon2d, использующий комбинацию зависимого от данных и независимого от данных доступа к памяти.
пароль_хэш():
Argon2id теперь является рекомендуемой переменной Argon2, используемой в функциях paswword_*.
具有自定义成员方法的名称的Argon2id与PASSWORD_ARGON2I的使用方法相同
password_hash('password',PASSWORD_ARGON2ID,['memory_cost'=> 1 << 17,'time_cost'=> 4,'threads'=> 2]);
password_verify();
Помимо Argon2i, функция password_verify() также работает с Argon2id.
password_needs_rehash();
Эта функция также примет хэш Argon2id и вернет true, если какой-либо из переменных-членов изменился.
$hash = password_hash('password', PASSWORD_ARGON2ID);
password_needs_rehash($hash, PASSWORD_ARGON2ID); // 返回假
password_needs_rehash($hash, PASSWORD_ARGON2ID, ['memory_cost' => 1<<17]); // 返回真
Устарело и удалено image2wbmp()
Эта функция может выводить изображение в формат WBMP. другой по имениimagewbmp()
В функции также входит функция монохромного преобразования. Итак, из соображений повторения,image2wbmp()теперь устарело, вы можете использоватьimagewbmp()
замени это. После того, как эта функция устарела, ее повторный вызов вызовет предупреждение об устаревании. После того, как эта функция будет впоследствии удалена, ее повторный вызов вызовет фатальную ошибку.
Устареть и удалить константы без учета регистра
В предыдущих версиях PHP вы могли использовать как чувствительные к регистру, так и нечувствительные к регистру константы. Но нечувствительные к регистру константы могут вызвать небольшие проблемы при использовании. Итак, чтобы решить эту проблему, в PHP 7.3 не рекомендуются константы без учета регистра.
Исходная ситуация была:
- Константы класса всегда "чувствительны к регистру".
- использовать
const
Глобальные константы, определяемые ключевыми словами, всегда "чувствительны к регистру". Обратите внимание, что это только имя самой константы, а не часть имени пространства имен.Пространство имен PHP всегда "нечувствительно к регистру". - использовать
define()
Константы, определяемые функциями, по умолчанию "чувствительны к регистру". - использовать
define()
функцию и установите третий параметр вtrue
Определенные константы нечувствительны к регистру.
PHP 7.3 теперь предлагает отказаться от следующих вариантов использования и удалить их:
- В PHP 7.3: устарело
true
в видеdefine()
третий параметр. - В PHP 7.3: Устарело использование имен, которые не чувствительны к регистру для определенного регистра, и доступ к константам, не чувствительным к регистру.
true
,false
так же какnull
Кроме.
Файлы cookie того же сайта
PHP 7.3 рекомендует добавлять тот же флаг сайта при использовании файлов cookie. Этот RFC затрагивает 4 системные функции.
- setcookie
- setrawcookie
- session_set_cookie_params
- session_get_cookie_params
Этот эффект работает в двух случаях. Один из способов добавить новый параметр в функцию , еще один способ разрешить параметрам в виде массива заменять другие отдельные параметры.
bool setcookie(
string $name
[, string $value = ""
[, int $expire = 0
[, string $path = ""
[, string $domain = ""
[, bool $secure = false
[, bool $httponly = false ]]]]]]
)
bool setcookie (
string $name
[, string $value = ""
[, int $expire = 0
[, array $options ]]]
)
// 两种方式均可.
обновление FPM
Диспетчер процессов FastCGI также был обновлен и теперь предоставляет новый способ регистрации FPM.
log_limit: установите допустимую длину журнала, которая может превышать 1024 символа.
log_buffering: позволяет вести журнал без дополнительной буферизации.
декорировать _workers_output: когда catch_workers_output включен, система отключит вывод рендеринга.
Улучшено удаление файлов под Windows
подобноофициальная документацияСказал:
По умолчанию файловые дескрипторы работают в режиме общего чтения, записи и удаления. Это эффективно отменяет сопоставление POSIX и позволяет удалять файлы, которые используются. Но это не на 100% то же самое, и могут быть некоторые различия между платформами. После операции удаления файловый каталог все еще существует до тех пор, пока не будут закрыты все операции с файлами.
заключительные замечания
Ранее мы рассмотрели функции последней версии PHP 7.3, включая множество новых и устаревших функций. Все эти функции доступны на веб-сайте php.net и объединены в ветку master. Теперь вы можете использовать эти новые функции для развертывания на своем собственном сервере, вы также можете открытьОфициальная страница RFCПроверьте каждую подробную версию. Если у вас есть какие-либо вопросы о новом PHP7.3, вы можете написать свои мысли в комментариях. Если вам понравилась эта статья и вы нашли ее полезной, вы можете подписаться на меня в Твиттере для получения дополнительной информации!
Статья перепечатана с:learnku.com/php/t/21549
Еще статьи:Learncool.com/pull-ravel/from/he…