Будет ли объявление типа в функциях делать мой код лучше?
PHP 7 медленно разворачивается, и люди начинают работать с ним, и я тоже.
Одна из новых функций в PHP7 заключается в том, что вы можете дать функциям объявление типа для входных данных и объявление типа для результата.
Например, один вход должен быть строкой, один int и результат будет логическим:
// PHP <7
function foo($example, $someNumber) {}
// PHP 7
function foo(string $example, int $someNumber): bool{}
без declare(strict_types=1)
Я знаю, что когда вы вводите неправильный тип, он конвертируется. Если вы введете номер для $example
, он будет преобразован в строку. Если вы добавите число с плавающей точкой как $someNumber
, он будет преобразован в круглое число. С объявлением вы получаете ошибку типа.
Помимо возможной "передовой практики", улучшит ли мой код объявлениями типа производительность кода? Я считаю, что это возможно, потому что я сейчас говорю интерпретатору, чего ожидать, но он также может добавить дополнительную проверку типов.
Стоит ли усилий и времени обновить эти функции?
1 ответ
В конечном счете, производительность не должна беспокоить вас при добавлении объявлений типов. Они существуют, чтобы облегчить жизнь программиста, а не переводчика. Используйте их, если считаете, что они будут вам полезны. Используете ли вы объявления типов или нет, вряд ли будет основным фактором, определяющим производительность вашего кода.
С учетом вышесказанного, в настоящее время (PHP 7.0) на самом деле существует небольшое снижение производительности при использовании объявлений типов, потому что теперь PHP должен проверять типы значений, которые вы передаете и выводите из функций. Быстрее вообще не проверять, что происходит, когда у вас нет объявления типа.
Тем не менее, это немного более нюанс, чем это, и ситуация меняется.
Строгая типизация заставляет вас передавать правильные типы
Если вы используете строгую типизацию, вы должны передать значение идеального типа (например, int), а не передавать какой-либо другой тип (например, строку) и заставить PHP преобразовать его для вас. Передача правильного типа происходит быстрее, чем преобразование PHP из какого-либо другого типа для вас: преобразования типов требуют времени.
Объявления типов могут избежать повторных преобразований типов
Если вы используете объявления типов со строгой типизацией или нет, вы обычно избегаете повторных преобразований типов для одного и того же значения.
Обычно, если у вас есть функция, которая выполняет несколько числовых операций, и вы передаете строковый аргумент, PHP должен будет преобразовывать ее в соответствующий числовой тип (int или float) каждый раз, когда он выполняет с ней операцию.
Но если у вас есть объявление типа для этого аргумента, оно преобразуется только один раз, либо автоматически (режим слабой типизации), либо потому, что вы явно преобразовали его самостоятельно.
Объявления типов позволяют PHP исключать проверки типов
Объявления типов дают вашей среде выполнения PHP гарантии, которые он может иногда использовать, чтобы избежать проверок типов, которые он должен делать в противном случае. Например, возьмите следующую строку кода:
$a = $b * $c;
Без объявления типов PHP сначала должен выполнить внутреннюю проверку типа $b
а также $c
прежде чем он действительно может умножить их; PHP должен убедиться, что они оба являются числовыми типами, преобразовать их, если это не так, и затем выполнить соответствующий тип умножения (int
×int
, float
×int
, так далее.).
Но если вы объявили типы $b
а также $c
заранее, тогда PHP не должен проверять их здесь, и может немедленно выполнить фактическое умножение. Это быстрее Это особенно верно, если вы выполняете несколько операций с этими переменными внутри функции.
Эта оптимизация реализована в PHP 7.1 при использовании OPcache.
Подобные оптимизации могут быть реализованы, чтобы избавиться от аргументов и проверок типа возвращаемого значения. Например, если одна функция объявляет параметр как int, нет необходимости снова проверять его тип, если затем он передает этот аргумент другой функции, которая также ожидает int. В настоящее время PHP 7.1 может отбрасывать некоторые ненужные проверки возвращаемого типа (и более при использовании OPcache), но не проверки типа аргумента.
Из-за этих типов оптимизаций снижение производительности для кода с объявлениями типов становится меньше, и существует значительный потенциал того, что код с объявлениями типов будет быстрее, чем код без него в будущем.