Php end of line
Php end of line
Эти константы объявляются ядром PHP и охватывают PHP, Zend engine и SAPI-модули.
PHP_VERSION ( string ) Текущая версия PHP в виде строки в формате «major.minor.release[extra]». PHP_MAJOR_VERSION ( integer ) Текущая «основная» (major) версия PHP в виде целого числа (например, int(5) для версии «5.2.7-extra»). Доступно с PHP 5.2.7. PHP_MINOR_VERSION ( integer ) Текущая «промежуточная» (minor) версия PHP в виде целого числа (например, int(2) для версии «5.2.7-extra»). Доступно с PHP 5.2.7. PHP_RELEASE_VERSION ( integer ) Текущая «релиз»-версия (release) PHP в виде целого числа (например, int(7) для версии «5.2.7-extra»). Доступно с PHP 5.2.7. PHP_VERSION_ID ( integer ) Текущая версия PHP в виде целого числа, её удобно использовать при сравнениях версий (например, int(50207) для версии «5.2.7-extra»). Доступно с PHP 5.2.7. PHP_EXTRA_VERSION ( string ) Текущая «экстра»-версия PHP в виде строки (например, ‘-extra’ для версии «5.2.7-extra»). Обычно используется в различных дистрибутивах для индикации версий пакетов. Доступно с PHP 5.2.7. PHP_ZTS ( integer ) Доступно с PHP 5.2.7. PHP_DEBUG ( integer ) Доступно с PHP 5.2.7. PHP_MAXPATHLEN ( integer ) Максимальная длина файловых имен (включая путь), поддерживаемая данной сборкой PHP. Доступно с PHP 5.3.0. PHP_OS ( string ) Операционная система, под которую собирался PHP. PHP_OS_FAMILY ( string ) Семейство операционных систем, для которых собран PHP. Любая из ‘Windows’, ‘BSD’, ‘Darwin’, ‘Solaris’, ‘Linux’ или ‘unknown’. Доступно с PHP 7.2.0. PHP_SAPI ( string ) API сервера (Server API) данной сборки PHP. Смотрите также php_sapi_name() . PHP_EOL ( string ) Корректный символ конца строки, используемый на данной платформе. Доступно с PHP 5.0.2 PHP_INT_MAX ( integer ) Максимальное целое число, поддерживаемое данной сборкой PHP. Обычно это int(2147483647) в 32-битных системах и int(9223372036854775807) в 64-битных. Доступно с PHP 5.0.5 Обычно, PHP_INT_MIN ===
PHP_INT_MAX. PHP_INT_MIN ( integer ) Минимальное целое число, поддерживаемое данной сборкой PHP. Обычно это int(-2147483648) в 32-битных системах и int(-9223372036854775808) в 64-битных. Доступно с PHP 7.0.0 PHP_INT_SIZE ( integer ) Размер целого числа в байтах в текущей сборке PHP. Доступно с PHP 5.0.5 PHP_FLOAT_DIG ( integer ) Количество десятичных цифр, которые могут быть округлены в float и обратно без потери точности. Доступно с PHP 7.2.0. PHP_FLOAT_EPSILON ( float ) Наименьшее положительное число x, такое, что x + 1.0 != 1.0. Доступно с PHP 7.2.0. PHP_FLOAT_MIN ( float ) Наименьшее возможное положительное число типа float . Если вам нужно наименьшее возможное отрицательное число типа float , используйте — PHP_FLOAT_MAX. Доступно с PHP 7.2.0. PHP_FLOAT_MAX ( float ) Максимальное возможное число типа float . Доступно с PHP 7.2.0. DEFAULT_INCLUDE_PATH ( string ) PEAR_INSTALL_DIR ( string ) PEAR_EXTENSION_DIR ( string ) PHP_EXTENSION_DIR ( string ) PHP_PREFIX ( string ) Значение опции «—prefix», указанной при запуске configure. PHP_BINDIR ( string ) Указывает путь установки бинарных файлов. PHP_BINARY ( string ) Указывает путь к исполняемым файлам PHP во время выполнения скрипта. Доступно с PHP 5.4. PHP_MANDIR ( string ) Указывает путь установки страниц документации man. Доступно с PHP 5.3.7. PHP_LIBDIR ( string ) PHP_DATADIR ( string ) PHP_SYSCONFDIR ( string ) PHP_LOCALSTATEDIR ( string ) PHP_CONFIG_FILE_PATH ( string ) PHP_CONFIG_FILE_SCAN_DIR ( string ) PHP_SHLIB_SUFFIX ( string ) Суффикс, используемый для динамически линкуемых библиотек, таких как «so» (для большинства Unix-систем) или «dll» (Windows). PHP_FD_SETSIZE ( string ) Максимальное количество файловых дескрипторов для системных вызовов. Доступно с PHP 7.1.0. E_ERROR ( integer ) Константа, указывающая уровень сообщений об ошибках E_WARNING ( integer ) Константа сообщения об ошибке E_PARSE ( integer ) Константа сообщения об ошибке E_NOTICE ( integer ) Константа сообщения об ошибке E_CORE_ERROR ( integer ) Константа сообщения об ошибке E_CORE_WARNING ( integer ) Константа сообщения об ошибке E_COMPILE_ERROR ( integer ) Константа сообщения об ошибке E_COMPILE_WARNING ( integer ) Константа сообщения об ошибке E_USER_ERROR ( integer ) Константа сообщения об ошибке E_USER_WARNING ( integer ) Константа сообщения об ошибке E_USER_NOTICE ( integer ) Константа сообщения об ошибке E_RECOVERABLE_ERROR ( integer ) Константа сообщения об ошибке Доступно с PHP 5.2.0 E_DEPRECATED ( integer ) Константа сообщения об ошибке Доступно с PHP 5.3.0 E_USER_DEPRECATED ( integer ) Константа сообщения об ошибке Доступно с PHP 5.3.0 E_ALL ( integer ) Константа сообщения об ошибке E_STRICT ( integer ) Константа сообщения об ошибке __COMPILER_HALT_OFFSET__ ( integer ) Доступно с PHP 5.1.0 TRUE ( boolean ) Смотрите раздел Булев тип. FALSE ( boolean ) Смотрите раздел Булев тип. NULL ( null ) Смотрите Null. PHP_WINDOWS_EVENT_CTRL_C ( integer ) Событие Windows CTRL+C. Доступно с PHP 7.4.0 (Только для Windows). PHP_WINDOWS_EVENT_CTRL_BREAK ( integer ) Событие Windows CTRL+BREAK. Доступно с PHP 7.4.0 (Только для Windows).
Стандартные предопределенные константы
Все константы, входящие в состав ядра расширений, теперь определены в PHP по умолчанию.
User Contributed Notes 3 notes
Volker’s getOS() function needs to have the order of cases changed in the switch statement since «darwin» contains «win», which means that both «windows» and «darwin» will return self::OS_WIN. I’ve moved the ‘dar’ case above the ‘win’ case:
const OS_UNKNOWN = 1 ;
const OS_WIN = 2 ;
const OS_LINUX = 3 ;
const OS_OSX = 4 ;
/**
* @return int
*/
static public function getOS () <
switch ( true ) <
case stristr ( PHP_OS , ‘DAR’ ): return self :: OS_OSX ;
case stristr ( PHP_OS , ‘WIN’ ): return self :: OS_WIN ;
case stristr ( PHP_OS , ‘LINUX’ ): return self :: OS_LINUX ;
default : return self :: OS_UNKNOWN ;
>
>
PHP_EOL can be used like that:
= ‘some data’ . PHP_EOL ;
$fp = fopen ( ‘somefile’ , ‘a’ );
fwrite ( $fp , $data );
?>
Which is the same of rn or n depending on the OS.
You can put those lines in a while for example, and create a log file.
Don’t use `PHP_EOL` for textarea of form to array, use it:
array_values(array_filter(explode(«n», str_replace(«r», », $_POST[‘data’]))))
Новые возможности PHP 7.4: стрелочные функции, распаковка в массивах, типизированные свойства
В конце 2019 года вышла новая версия PHP. В этой статье пойдёт речь о возможностях PHP 7.4.
PHP — один из самых востребованных языков программирования. Он широко используется в веб-разработке: на PHP написаны популярные CMS, в том числе WordPress, Joomla!, Drupal. На этом языке созданы фреймворки Laravel, Yii2 и Symfony, которые активно используют веб-разработчики.
Давайте посмотрим, какие инструменты появились у разработчиков после выхода PHP 7.4.
Новая версия делает PHP более выразительным
Версия PHP 7.3 принесла в язык новый синтаксис и производительность. А PHP 7.4 делает код более удобным, читабельным и простым в поддержке. Благодаря этому язык становится быстрее и надёжнее. Ниже описаны основные нововведения версии 7.4.
Стрелочные функции
PHP-программисты давно ждали появления стрелочных функций, похожих на стрелочные функции в JavaScript. Такой синтаксис проще использовать. Однако функции массивов в PHP, известные как короткие замыкания, отличаются от стрелочных функций в JS.
В PHP 7.4 появляется ключевое слово fn . Короткие замыкания могут содержать только одно выражение без ключевого слова return . Стрелочные функции в PHP — не такой мощный инструмент, как их «тёзки» из JavaScript. Но в некоторых ситуациях они становятся оптимальным инструментом.
Типизированные свойства PHP
Приведение типов появилось в PHP 5.0. В более поздних версиях эта функциональность развивалась. В версии 7.0 появились типы возвращаемых значений. В PHP 7.4 ввели объявление типов для свойств классов.
Типизированные свойства работают внутри классов и требуют модификаторов доступа. Чтобы лучше понять концепцию, рассмотрим пример.
В коде выше значением свойства $id может быть только число, а значением $title — строка. Если вы попытаетесь использовать другие типы данных, получите фатальную ошибку.
Распаковка внутри массивов
Распаковка аргументов появилась в PHP 5.6. А начиная с версии 7.4 можно пользоваться распаковкой внутри массивов. Это должно быть быстрее, чем array_merge() благодаря спред-оператору.
В коде ниже видно, как работает распаковка внутри массива.
Присваивающий оператор объединения с null
Это нововведение упрощает код в некоторых ситуациях. Фактически это быстрый способ объединить проверку isset() с тернарным оператором. В примере ниже видно, как можно обратиться к значению ключа id в ассоциативном массиве $product . Если значение ключа установлено, то вновь устанавливается то же значение. Если оно не установлено, присваивается значение справа. Показаны примеры кода на PHP 7.0 и 7.4. Видно, что последняя версия лаконичнее.
Слабые ссылки
Эта возможность позволяет разработчикам сохранять ссылки на объекты. Сохранение ссылки не исключает уничтожение объекта. С помощью слабых ссылок (weak references) создаётся подобие кэшированных структур. Пример:
Устаревшие конструкции
С выходом PHP 7.4 часть возможностей языка переходит в категорию устаревших (deprecations). Язык перестанет их поддерживать.
Вложенный тернарный оператор без скобок
Вложенные тернарные операторы лучше не использовать. В таких конструкциях легко ошибиться. Но если вы всё-таки хотите применить вложенный тернарный оператор, используйте его со скобками. Начиная с версии PHP 7.4 вложенные тернарные операторы без скобок считаются устаревшими.
Использование array_key_exists() с объектами
Не используйте array_key_exists() с объектами, так как объекты — не массивы. Вместо этого лучше использовать функцию property_exists() или isset () .
Обращение к индексу массива или строки с помощью фигурных скобок
Использование фигурных скобок для обращения к индексу массива или строки в реальном коде встречается редко. А начиная с версии PHP 7.4 такой код считается устаревшим.
Короткие открытые теги
В PHP использовались разные альтернативы открытым тегам для обозначения начала PHP-кода. Большая часть этих альтернатив была удалена из языка после выхода версии 7.0. Однако некоторые из коротких открытых тегов PHP остались.
Повышение производительности
Главная мотивация перейти на PHP 7.4 — повышение производительности. В версии 7.4 используется предварительная загрузка. Она реализована с помощью расширения Opcache. Это расширение сохраняет в общей памяти предварительно скомпилированный байткод. Благодаря этому не нужно загружать скрипты при каждом запросе.
Opcache работает с опкодом — упрощённым или низкоуровневым представлением PHP-кода. Расширение предварительно компилирует написанный разработчиком код в опкод и загружает в память. Так работает предварительная загрузка.
Этот механизм работает быстрее альтернативы: загрузки файлов при каждом запросе. В конечном итоге благодаря предварительной загрузке растёт производительность PHP 7.4.
Ковариантные возвраты и контравариантные параметры
До выхода версии 7.4 в PHP использовались преимущественно инвариантные параметры и возвращаемые типы. В новой версии вводится ковариантность и контравариантность для типов возвращаемых данных и параметров.
Есть такие типы параметров:
- Инвариантные. Используются, если тип супертипа ограничивает тип подтипа.
- Ковариантные. Применяются, если порядок типов сохраняется, то есть типы упорядочены от более специфичных к более общим.
- Контравариантные. Используются при изменении порядка от более общих к более специфичным типам.
Код ниже показывает ковариантный и контравариантный типы возврата.
О перспективах
В PHP 7.4 появилось не слишком много новых возможностей, поэтому не все разработчики верят в сильное повышение производительности. В сообществе PHP-программистов идут разговоры о версии 8.0, которая принесёт в язык программирования большие нововведения и серьёзно повысит производительность.Тем не менее точная дата релиза PHP 8.0 пока не объявлена.
Адаптированный перевод статьи A Closer Look at PHP’s Latest Version 7.4 by Ruchika Singh Aggarwal. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.
13 неожиданностей в PHP, о которых знают не все
Казалось бы, все знаешь, пишешь себе функции, используешь операторы и получаются у тебя крутые, быстрые и понятные конструкции кода, классы, например. Но в какой-то момент внезапно нарываешься на ситуацию, когда код работает так, как нужно ему, а не как ожидаешь ты и все это как-будто вопреки здравому смыслу. Но код никогда не ошибается.
Ниже поговорим про интересные и неожиданные, неочевидные и особенные случаи в PHP.
explode() в 2 раза быстрее unserialize()
Если для сохраняемых чисел не важен тип (число), лучше хранить числа через запятую, чем их же сериализовать.
isset() в 2 раза быстрее in_array()
Скорости очень быстрые, но если обрабатываются большие массивы, то есть смысл заюзать array_flip() и искать значение через isset() :
PHP язык без строгой типизации и потому иногда могут возникать неожиданные результаты при сравнении (проверке) разных значений.
Происходит так очевидно, потому что ‘строка’ превращается в ноль: intval( ‘строка’ ) = 0 , а 0 == 0 это true, разумеется.
Так например можно пропустить переменную запроса:
Все следующие значения одинаковы, при сравнении через == (не строгий оператор сравнения):
in_array() нас обманывает
Вы мастер массивов в PHP. Вы уже знаете все о создании, редактировании и удалении массивов. Тем не менее, следующий пример может вас удивить.
Часто при работаете с массивами приходится в них что-либо искать с помощью in_array() .
Как думаете выведет этот пример надпись «Неужто нашлось»? После такого вопроса, вы наверняка решили что условие сработает, но при написании кода, скорее всего было бы наоборот — и вы бы решили что условие не сработает На самом деле, это условие сработает и код выведет надпись «Неужто нашлось».
Так происходит, потому что PHP язык бестиповой и in_array() в данном случае сравнивает значения, но не учитывает тип, т.е. использует оператор == , а не === . А ‘строка’ == true даст нам true. Вот и получается что in_array() лжёт!
Решение
Чтобы избежать такого «обмана», нужно указать true в третий параметр в in_array() , так все сравнения будут проходить с учетом типа значения.
Разница между PHP операторами OR и || , AND и &&
PHP операторы OR , AND и || , && соответственно, отличаются приоритетами выполнения. У последних он выше, поэтому они будут выполняться раньше.
Если сравнивать с оператором присваивания: = , то OR/AND будут выполняться ПОСЛЕ оператора присваивания, в то время как у || и && будут выполняться ДО оператора присваивания, из за более высокого приоритета. Рассмотрим эту разницу на примере:
AND и &&
Полезная ссылка по этой теме: Приоритет оператора
Шунтирующие операторы (короткая запись)
При сравнении типа AND && , если первое условие вернет false/0/»/array() , то нет смысла проверять следующие условия, потому что всё условие выполнится только если сразу все вложенные условия вернут что-либо отличное от empty (не false).
При сравнении типа OR || , если хоть одно условие вернет true или что-то отличное от empty, то нет смысла проверять следующие вложенные условия, потому что все условие выполняется когда хоть одно под-условие возвращает не false.
count() не всегда дает ожидаемый результат
Все мы привыкли проверять наличие значения в массиве через isset() . Однако если элемент в массиве есть, но его значение null, то isset() вернет false, как если бы элемента в массиве не было.
Наличие элемента со значением null можно проверить функцией array_key_exists() .
Странное поведение в PHP при передаче значения foreach по ссылке
Мы дважды проводим итерацию по массиву, ничего не делая. Так что в результате никаких изменений не должно быть. Правильно? — Неправильно!
Чтобы не ловить такие баги, при передаче по ссылке значения в foreach, указывайте уникальное значение переменной $val или очищайте $val после foreach с помощью unset($val) .
Почему так происходит отлично объясняется тут.
empty() и объекты
Проверка empty() на объектах может вести себя странно. Допустим у нас есть некий объект $obj и мы проверяем пусто ли свойство var , и получаем такое:
Парадокс! Как такое может быть? empty() говорит что свойство пустое, а ! говорит что в нем что-то есть. Как одно и тоже свойство может быть пустым и не пустым одновременно? Квантовая суперпозиция господа.
Однако если разобраться, то нет тут ничего удивительного и все логично!
Дело в том, что конструкция empty() обращается к встроенному методу объекта __isset() , а прямой запрос свойства ($obj->var) обратиться к __get() .
Т.е. получается empty() и ! запрашивают разные методы, если свойство не установлено:
А теперь, зададим значение свойства bar в __isset() и empty() его получит:
Имеет большое значение в каком положении использовать ++ (инкремент, увеличитель).
++$i — увеличивает $i на 1, сразу — при текущем вызове $i .
$i++ — увеличит $i на 1, при следующем вызове $i .
— — уменьшитель (декремент) работает точно также.
Повторим еще раз:
Пример | Название | Действие |
---|---|---|
++$a | инкремент до | Увеличивает $a на 1, затем возвращает значение $a. |
$a++ | инкремент после | Возвращает значение $a, затем увеличивает $a на 1. |
—$a | декремент до | Уменьшает $a на 1, затем возвращает значение $a. |
$a— | декремент после | Возвращает значение $a, затем уменьшает $a на 1. |
меню
С числами все довольно просто, но что будет если инкрементить строки?
Что выведет данный код?
При инкременте строки, PHP увеличивает последний символ на символ следующий по алфавиту. И если в конце 2, то следующий символ будет 3. После t следует u. Однако эта операция не имеет никакого смысла в случае, когда строка заканчивается на не буквенно-численный символ.
Этот момент хорошо описан в официальной документации по операциям инкремента/декремента, однако многие не читали этот материал, потому что не ожидали встретить там ничего особенного.
Неточности с плавающей точкой
Посчитайте эту арифметику и скажите результат:
Сколько получилось, 8? А у компьютера 7!
Так происходит, потому что компьютеры не умеют хорошо работать с неточными числами — это как выясняется большая и старая проблема, есть даже статья на эту тему: «Что каждый компьютерщик должен знать об операциях с плавающей точкой».
Что получается в итоге и где ошибка?
Однако, если посчитать так, то увидим 0.8, а не 0.79999999999. Хотя этот результат является лишь округлением:
Какой вывод можно сделать из этого примера? Будьте очень осторожны, когда дело касается дробных чисел (чисел с плавающей точкой) и никогда им не доверяйте.
Для складываний и вычитаний флоат чисел в PHP есть спец. фукцнии: bcadd() , bcsub() . Например:
Все объекты в PHP передаются по ссылке
Это свойство объектов вам возможно известно, но даже в этом случае можно поймать баг, поэтому при работе с объектами будьте внимательны.
Для примера, давайте рассмотрим такой код, когда мы используем объект для удобства, который создается из массива:
Мы создали казалось бы общие данные, который потом планируем использовать в разных переменных, меняя данные объекта где нужно, а где не нужно оставляя исходный вариант. В этом случае изменение данных будет менять их и в исходном варианте.
Так, например, если использовать массив, то все будет работать как мы ожидаем. Тот же код но с массивом:
Поэтому чтобы первый вариант работал правильно, в переменную нужно передавать копию объекта, создаваемую с помощью clone :
При сложении массивов элементы добавляемого массива не заменяют исходные, как это часто ожидается.
Изменение типа данных в ключах массива
При создании индекса массива PHP автоматически преобразовывает тип данных. Это надо учитывать, при работе с ассоциативными массивами. Так например, если в индекс передать число в виде строки (‘555’), то в индексе оно станет числом, или если в индекс передать true, то оно станет числом 1, а вот null превратиться в пустую строку. Пример кода см. ниже.
В массиве key может быть либо типа integer , либо типа string . value может быть любого типа.
Дополнительно с ключом key будут сделаны следующие преобразования:
- Строки, содержащие целое число (исключая случаи, когда число предваряется знаком + ) будут преобразованы к типу integer . Например, ключ со значением «8» будет в действительности сохранен со значением 8. С другой стороны, значение «08» не будет преобразовано, так как оно не является корректным десятичным целым.
- Числа с плавающей точкой (тип float ) также будут преобразованы к типу integer , то есть дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением 8 .
- Тип bool также преобразовываются к типу integer . Например, ключ со значением true будет сохранен со значением 1 и ключ со значением false будет сохранен со значением 0.
- Тип null будет преобразован к пустой строке. Например, ключ со значением null будет в действительности сохранен со значением «» .
Массивы (тип array) и объекты (тип object) не могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type). - Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний будет использоваться, а все другие будут перезаписаны.
Closure::call — вызов анонимной функции с указанием контекста
Это не столько неожиданность, сколько интересная особенность, о которой мало кто знает.
PHP замыкания (анонимные функции) можно вызывать передавая в них контекст (объект). В результате замыкание можно использовать как метод переданного объекта.
Для этого в объекте замыкания есть метод:
$that(object) Объект для привязки к замыканию на время его вызова. . $params Сколько угодно параметров, которые передаются в замыкание.
Пример того как это использовать
Что мы видим? При вызове одного и того же замыкания мы получаем разный результат, который зависит от контекста вызова (от того какой объект передается и используется в замыкании).