我在CakePHP 2.2中有一个应用程序& MySQL的。 我注意到返回值的类型转换是许多类型的字符串,如Float,Decimal,Int,Varchar,Text等..:
Float或Decimal:
var_dump($this->field('field_name'));
string(4) "1.00"
内部
var_dump($this->field('field_name'));
string(1) "1"
仅在使用TINYINT(1)作为布尔字段时才会出现此问题:
TINYINT(1)
var_dump($this->field('field_name'));
bool(true)
通常对于货币字段我将字段类型设置为FLOAT或DECIMAL(11,2)...也许我错误在CakePHP中使用这种类型? 这种行为非常繁琐,特别是对于十进制字段,因为当值为0时,返回字符串“0.00”,即为真。 所以我必须永远记得强制这样的类型:
if((float)$this->field('price')){
....
}
为什么CakePHP不会通过正确的类型转换返回值?我该如何解决?谢谢!
答案 0 :(得分:1)
这不是CakePHP问题。这是由于PHP脚本语言中目前使用的松散类型。 TinyInt和Boolean工作,因为它被转换为bool类型。
所有人都使用的工作是严格地将你希望浮动的变量转换为浮动,如你的例子所示。要检查字符串是否为数字,您可以使用is_numeric()
函数:
if (is_numeric($testedFloatString)) {
//If $testedFloatString is a string representing a number cast it to float
$testedFloatString = (float) $testedFloatString;
}
这是"Type Juggling"的概念。你需要记住的浮点数是:
$varName = (float) $varName;
$varName = (double) $varName;
$varName = (real) $varName;
将全部投放到PHP's Float。期待已久的PHP 6严格打字将不复存在这个问题,但我们将不得不等待更多。至于现在 - 唯一的方法是自己处理这些变量。
要在CakePHP中为您需要的模型自动管理此项,请使用Model::afterFind()
callback。此回调用于“修改从查找操作返回的结果或执行任何其他查找后逻辑。还要注意第二个参数,例如从关联模型调用模型的find()
时结果数组的结构会有所不同。