Как я могу заставить парсер PHP7 принудительно возвращать типы?

Есть ли какая-либо директива в последних версиях 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;
}

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

Я имею в виду:

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


person Xavi Montero    schedule 11.05.2018    source источник
comment
Насколько я знаю, в настоящее время (PHP 7.2) нет способа принудительно объявить возвращаемый тип.   -  person Łukasz Jakubek    schedule 11.05.2018
comment
Хорошо Лукаш, спасибо! Посмотри если в 7.3 то.   -  person Xavi Montero    schedule 11.05.2018
comment
Я хотел бы указать, что ваш пример кода в вопросе является недопустимым PHP, потому что ваши переменные не имеют знаков $. :-)   -  person Simba    schedule 11.05.2018
comment
Ах, да! Исправил, спс!   -  person Xavi Montero    schedule 11.05.2018


Ответы (3)


Я просмотрел PHP RFC: объявления типов возврата и нет возможности (на данный момент и в будущем релизе) сделать подобное...

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

person Nico    schedule 11.05.2018

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

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

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

person Simba    schedule 11.05.2018

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

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

person B. Walger    schedule 11.05.2018
comment
а) Я просто хочу знать, есть ли способ заставить PHP вести себя как строго типизированный язык в отношении возвращаемых типов. б) если вы хороший кодер, вы должны всегда делать чистый код, независимо от размера проекта. Возможно, вам понравится это чтение: amazon.com/Clean- Code-Handbook-Software-Craftsmanship-ebook/dp/ - person Xavi Montero; 11.05.2018