1

我在 CakePHP 2.2 和 MySQL 中有一个应用程序。我注意到返回值的类型转换是许多类型的字符串,如 Float、Decimal、Int、Varchar、Text 等:

浮点数或小数:

var_dump($this->field('field_name'));
string(4) "1.00" 

诠释

var_dump($this->field('field_name'));
string(1) "1" 

仅对布尔字段使用 TINYINT(1) 不会出现此问题:

小音(1)

var_dump($this->field('field_name'));
bool(true) 

通常对于货币字段,我将字段类型设置为 FLOAT 或 DECIMAL(11,2)... 也许我在 CakePHP 中使用这种类型是错误的?这种行为非常乏味,尤其是对于十进制字段,因为当值为 0 时返回字符串“0.00”,这是真的。所以我必须永远记住强制这样的类型:

if((float)$this->field('price')){
....
}

为什么 CakePHP 不返回正确类型转换的值?我该如何解决?谢谢!

4

1 回答 1

2

这不是 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;
}

这就是“类型杂耍”的概念。对于浮点数,您需要记住的是:

$varName = (float) $varName;
$varName = (double) $varName;
$varName = (real) $varName;

将全部转换为PHP 的 Float。随着期待已久的 PHP 6 严格类型的出现,这个问题将不复存在,但我们将不得不再等一会儿。至于现在 - 唯一的方法是自己处理这些变量。要在 CakePHP 中为您需要的模型自动管理此回调,请使用Model::afterFind()回调。此回调用于“修改已从查找操作返回的结果或执行任何其他查找后逻辑。还要注意第二个参数,因为当find()从关联模型调用模型时,结果数组的结构将是不同的。

于 2013-02-04T11:13:36.737 回答