Как я могу сделать синтаксический анализатор PHP7 для принудительного возвращения типов? - PullRequest
0 голосов
/ 11 мая 2018

Есть ли какая-либо директива в недавних PHP (возможно, похожая на директиву declare( strict_types = 1 );), которая говорит интерпретатору PHP «принудительно» возвращать типы в функциях, и, если нет возвращаемого типа, происходит сбой из-за синтаксического анализа /синтаксическая ошибка?

Мне бы хотелось, чтобы в коде было разрешено:

public function add( int $a, int $b ) : int
{
    return $a + $b;
}

, но этот:

public function add( int $a, int $b )
{
    return $a + $b;
}

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

Я имею в виду:

Я не хочу "принудительно возвращать тип возврата в определенной функции"(Я уже делаю это).Я хочу, чтобы конфигурация «заставляла меня принудительно возвращать типы во всех функциях файла или проекта».

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Я посмотрел на PHP RFC: декларации типов возвращаемых данных и нет способа (на данный момент и для будущего выпуска) сделать такую ​​вещь ...

Это то же самоедля declare(strict_types=1) ( PHP RFC: объявления скалярных типов ), которые обеспечивают только строгую проверку существующих объявлений .

0 голосов
/ 11 мая 2018

Короткий ответ на ваш вопрос: нет. PHP не имеет ничего, чтобы заставить вас определить тип возвращаемого значения.Также нет ничего, что заставляло бы вас определять типы для ваших аргументов - strict_types = 1 заставляет передаваемые значения иметь правильный тип для метода, если тип определен, но вы все равно можете писать методы с аргументами, которые нене может определить тип.

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

В то же время, я бы предложил использовать инструмент проверки кода, чтобы помочь вам обеспечить детализацию такого рода в вашем коде.Такой инструмент, как PHP Code Sniffer, станет хорошим началом.Вы можете добавить его в свою среду IDE, чтобы получать предупреждения в режиме реального времени, когда ваш код не соответствует определенным стандартам, и вы можете добавить его в свой рабочий процесс, чтобы предотвратить фиксацию и / или развертывание кода в случае сбоя кода.тест.

0 голосов
/ 11 мая 2018

В чем точно ваша проблема с отсутствием принудительного фиксированного типа возврата? Мне нравится ленивый способ кодирования с помощью PHP. Я мог бы быть громоздким в больших проектах, чтобы найти ошибочное имя переменной или неверно введенное возвращаемое значение, которое я допускаю. Но есть средства для этого.

Если вызывающий ожидает определенный тип, он может (должен!) Все равно проверить его. Это можно сделать, преобразовав результат в запрошенный тип и выдав исключение при сбое, как показано в Исключение PHP String-to-Integer . Или в случае целого числа, просто используя is_numeric , is_nan , is_real и т. Д. Вы можете поместить эти тесты в функции-члены для каждого типа в базовом объекте или даже использовать глобальный объект-тестер синглтона с этими функциями-членами и т. д.

...