Да, теперь это возможно,
После продолжительного обсуждения предложение о реализации подсказок типа для параметров скалярной функции и возвращаемых значений было только что одобрено с наибольшим количеством голосов, пока что, проверьте детали:
Подсказка скалярного типа состоит из объявления типов параметров функции и возвращаемых значений, которые могут быть типов int, float, string и bool. Это позволяет движку PHP времени выполнения проверять, переданы ли типы значений функциям параметров, и возвращать значения имеют ожидаемые типы для обнаружения возможных ошибок программирования.
Подсказки типов для объектов, массивов и вызываемых объектов уже разрешались в прошлых версиях PHP.
Текущая реализация представляет пять новых зарезервированных слов: int, float, bool, string и numeric. Они не были ранее зарезервированы, потому что приведение - это особый случай в лексере.
Example :
function test(float $a) {
var_dump($a);
}
test(1); // float(1)
test("1"); // float(1)
test(1.0); // float(1)
test("1a"); // E_RECOVERABLE_ERROR
test("a"); // E_RECOVERABLE_ERROR
test(""); // E_RECOVERABLE_ERROR
test(1.5); // float(1.5)
test(array()); // E_RECOVERABLE_ERROR
test(new StdClass); // E_RECOVERABLE_ERROR
У вас также есть возможность объявить в исходном файле, где вы можете разрешить хинтинг типа Scaler. Он должен быть первой строкой вашего скрипта конфигурации и не может быть объявлен в другом месте в том же файле.
Like : declare(strict_types=1);
Во время выполнения, когда механизм PHP пытается вернуть значение, он проверит, не совпадает ли заявленное, и выдаст фатальную ошибку, например,
Неустранимая ошибка: аргумент 1, передаваемый в increment (), должен иметь тип integer, строка:
С помощью этой новой функции объявления вы можете создавать более надежные приложения, обнаруживая ранние ошибки программирования, вызванные передачей значений неправильных типов в функции.
Также могут происходить автоматические изменения типов. Например, типы int могут автоматически изменяться на параметры типа float,
function test(float $x){
var_dump($x);
}
test(10); // works fine
Объявление типа возврата
Мы можем объявить возвращаемые типы, добавив двоеточие с последующим ожидаемым типом между последней скобкой и первой скобкой в объявлении функции.
Для функций, которые не возвращают никакого значения, ничего не следует добавлять в раздел объявления возвращаемого типа.
function mustReturnInt(): int { ... }
function mustReturnString(): string { ... }
function mustReturnBool(): bool { ... }
function mustReturnFloat(): float { ... }
function doesNotReturnAnything() { ... }
Немного более сложный пример
declare(strict_types=1);
class StrictTypesTestingClass {
public function returnSameInt(int $value): int { return $value; }
public function returnSameFloat(float $value): float { return $value; }
public function returnSameString(string $value): string { return $value; }
public function returnSameBool(bool $value): bool { return $value; } }
$check = new StrictTypesTestingClass(); // calls that work print $check->returnSameInt(10);
print $check->returnSameFloat(10.0);
print $check->returnSameString("test");
print $check->returnSameBool(true) ? 'true' : 'false'; // calls that throw exceptions
print $check->returnSameInt("10");
print $check->returnSameFloat("10.0");
print $check->returnSameString(10);
print $check->returnSameBool("true");
Поведение при слабой проверке типов и преобразовании типов: режим слабой проверки типов можно использовать с оператором Declare (strict_types = 0); или отсутствие строгой декларации типов. Есть несколько моментов, которые необходимо учитывать:
Слабый тип проверенных вызовов к расширению или встроенной функции PHP имеет такое же поведение, как и в предыдущих версиях PHP
Правила слабой проверки типов для новых объявлений скалярных типов в основном такие же, как и для расширенных или встроенных функций PHP.
NULL является особым случаем, чтобы соответствовать текущим объявлениям типов для классов, вызываемых и массивов. NULL не принимается по умолчанию, если только он не является параметром и ему явно задано значение по умолчанию NULL, например: функция sample (int $ a = NULL);
У этого подхода много преимуществ. Вы получаете безопасность типа. А это значит, что вы наконец-то можете статически анализировать код! Вы можете обнаружить ошибки, когда вы случайно взяли строку из одной функции и передали ее как целое число в другую. Для меня, разработчика, который ежедневно использует PHP и рассматривает Java как ссылку для языков ООП, это большой прогресс для PHP .