Ответ 1
Из блога Treehouse:
В PHP 7 мы добавили скалярные типы. В частности: int, float, строка и bool.
Добавляя подсказки скалярного типа и обеспечивая строгие требования, это надеется, что более правильные и самодокументированные программы PHP могут быть написано. Это также дает вам больше контроля над вашим кодом и может сделать код легче читать.
По умолчанию скалярные объявления типов не являются строгими, что означает, что они будет пытаться изменить исходный тип в соответствии с указанным типом по объявлению типа. Другими словами, если вы передаете строку, которая начинается с числа в функцию, которая требует плавающего, он будет возьмите номер с начала и удалите все остальное. Переходя float в функцию, которая требует int, станет int (1).
По умолчанию PHP преобразует значения неправильного типа в ожидаемый скалярный тип, если это возможно. Например, функция, которой присвоено целое число для параметра, который ожидает строку, получит переменную типа string.
Строгие типы отключены (eval):
<?php
function AddIntAndFloat(int $a, float $b) : int
{
return $a + $b;
}
echo AddIntAndFloat(1.4,'2');
/*
* without strict typing, php will change float(1.4) to int(1)
* and string('2') to float(2.0) and returns int(3)
*/
Возможно включить строгий режим для каждого файла. В строгом режиме будет принята только переменная точного типа в объявлении типа, или будет выдана ошибка TypeError. Единственное исключение из этого правила состоит в том, что целое число может быть дано функции, ожидающей float. Вызовы функций из внутренних функций не будут затронуты объявлением strict_types.
Чтобы включить строгий режим, выражение объявления используется с объявлением strict_types:
Разрешены строгие типы (eval):
<?php declare(strict_types=1);
function AddIntAndFloat(int $a, float $b): int
{
return (string) $a + $b;
}
echo AddIntAndFloat(1.4,'2');
// Fatal error: Uncaught TypeError: Argument 1 passed to AddIntAndFloat() must be of the type int, float given
echo AddIntAndFloat(1,'2');
// Fatal error: Uncaught TypeError: Argument 2 passed to AddIntAndFloat() must be of the type float, string given
// Integers can be passed as float-points :
echo AddIntAndFloat(1,1);
// Fatal error: Uncaught TypeError: Return value of AddIntAndFloat() must be of the type integer, string returned
рабочий пример:
<?php
declare(strict_types=1);
function AddFloats(float $a, float $b) : float
{
return $a+$b;
}
$float = AddFloats(1.5,2.0); // returns 3.5
function AddFloatsReturnInt(float $a, float $b) : int
{
return (int) $a+$b;
}
$int = AddFloatsReturnInt($float,1.5); // returns 5
function Say(string $message): void // as on php 7.2
{
echo $message;
}
Say('Hello, world!'); // prints hello world
function ArrayToStdClass(array $array): stdClass
{
return (object) $array;
}
$object = ArrayToStdClass(['name' => 'azjezz','age' => 100]); // returns an stdClass
function StdClassToArray(stdClass $object): array
{
return (array) $object;
}
$array = StdClassToArray($object); // returns array
function ArrayToObject(array $array): object // as of php 7.2
{
return new ArrayObject($array);
}
function ObjectToArray(ArrayObject $object): array
{
return $object->getArrayCopy();
}
var_dump( ObjectToArray( ArrayToObject( [1 => 'a' ] ) ) ); // array(1 => 'a');