Заранее извиняюсь, если это ламерский вопрос, это мой первый. Я создаю небольшой фреймворк для университетского проекта и хотел как можно больше применять типы. Приятно видеть, что теперь в PHP 7.4 есть строгие типы для свойств,
Но это не применяется должным образом даже при объявлении strict_types.
Кроме того, я знаю, что люди говорят, что в PHP нет разницы между значениями типа double и float, но с типизированными свойствами PHP не распознает тип данных типа double.
См. простой тест кода ниже:
class FloatTest
{
private float $float;
private int $int;
function __construct()
{
}
public function setFloat(float $float):void
{
$this->float = $float;
}
public function getFloat()
{
return $this->float;
}
public function setInt(int $int):void
{
$this->int = $int;
}
public function getInt():int
{
return $this->int;
}
}
$ft = new FloatTest();
$ft->setFloat(8);//No error is thrown, converts to float but no decimals
$ft->getFloat();// Returns number 8 as float, but there is no enforcing of decimal point?
var_dump(is_float(8));//returns false
//Argument 1 passed to FloatTest::setInt() must be of the type int, float given
$ft->setInt(8.2);//Works as expected, great!
class DoubleTest
{
private double $double;
function __construct()
{
# code...
}
public function setDouble(double $double):void
{
$this->double = $double;
}
public function getDouble():double
{
return $this->double;
}
}
$dt = new DoubleTest();
//Argument 1 passed to DoubleTest::setDouble() must be an instance of double, int given:
$dt->setDouble(8);
$double = $dt->getDouble();
var_dump(is_double(8)); returns false
Основываясь на этом очень простом тесте, у меня есть несколько моментов, которые я нахожу странными:
Почему PHP правильно применяет тип int, а не тип float? Почему, когда я проверяю с помощью is_float(), он возвращает false, но функция принимает целое число?
Почему целочисленный тип идеально соблюдается, а не плавающий?
Несмотря на то, что PHP имеет допустимый тип данных double, почему он предполагает, что double является экземпляром? double определенно является примитивным типом данных в PHP, так как функция is_double() работает отлично, см. исключение выше.
В принципе, что было бы лучшим и самым чистым решением для обеспечения десятичных чисел в PHP?