Progress28.ru

IT Новости
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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.

Читать еще:  Guest list php node

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 пока не объявлена.

Читать еще:  Php num rows

Адаптированный перевод статьи 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 Сколько угодно параметров, которые передаются в замыкание.

Пример того как это использовать

Что мы видим? При вызове одного и того же замыкания мы получаем разный результат, который зависит от контекста вызова (от того какой объект передается и используется в замыкании).

Ссылка на основную публикацию
Adblock
detector
×
×