我的PHP函数是否应该主动返回;对",;类型?

我的PHP函数是否应该主动返回;对",;类型?,php,Php,我制作了各种功能,如“从我的银行账户()获取当前余额”。从技术上讲,它返回一个字符串,但它始终是一个完整的整数(作为字符串),当它的返回变量直接用于计算时,它从来不会引起问题 然而,这感觉是错误的 我应该这样做吗 return (int)$amount_as_a_string; 而不是当前的: return $amount_as_a_string; ??或者(int)是某种古老的/传统的方法吗?我应该使用其他更好的方法吗 上下文示例: 同样,我很少会遇到这样的问题,因为它理解“真实”类型。

我制作了各种功能,如“从我的银行账户()获取当前余额”。从技术上讲,它返回一个字符串,但它始终是一个完整的整数(作为字符串),当它的返回变量直接用于计算时,它从来不会引起问题

然而,这感觉是错误的

我应该这样做吗

return (int)$amount_as_a_string;
而不是当前的:

return $amount_as_a_string;
??或者(int)是某种古老的/传统的方法吗?我应该使用其他更好的方法吗

上下文示例:


同样,我很少会遇到这样的问题,因为它理解“真实”类型。从技术上讲,我返回并发送字符串在理论上迟早会导致问题——可能是生产中的灾难性问题——这仍然是错误的

这在PHP中永远都不需要,因为它自己进行类型转换。然而,如果你愿意,你可以这样做。这取决于不同的项目,但有时会决定某个项目在可能的情况下使用显式类型。此外,如果您所在的团队中有些人对更严格的语言感到满意,那么这也是一种很好的做法

在您的情况下,根据数字的不同,将其保留为字符串可能有好的一面,就像您通过强制转换将其转换为int,并且数字大于max_int_大小,它将溢出


至于另一个问题,将其转换为int
(int)
(integer)
是一种非常好的方法,即使在较新的版本中也是如此。这不是一种传统的方式。不过,这并不意味着没有其他好方法可以做到这一点。你也可以用或之类的词。在我看来,没有一种正确的方法可以做到这一点。您可以自行决定如何执行该操作。

PHP将在许多情况下隐式键入cast,但不是所有情况。例如:

echo json_encode(['balance' => get_current_balance_from_my_bank_account()]);
现在,您的类型通过JSON传播到另一个系统,如果该系统对类型不太宽容,可能会导致实际问题。你让别人来处理你不正确的类型


因此,是的,您的函数应该始终返回它声明返回的类型。当您不坚持自己的类型声明时,PHP会暗中“帮助”您,这只是在扫除问题,但问题仍然存在,并可能最终导致实际问题。

考虑到PHP具有自动类型转换功能,我认为您不必太担心这一点

从文档中:

PHP不需要(或支持)变量声明中的显式类型定义;变量的类型由上下文决定 其中使用了变量

函数返回正确的数据类型并不意味着该值是正确的或是您所期望的


如果要确保函数返回ok值,请在返回之前对其进行验证,这比简单地将其键入正确的类型要有用得多。

如果要更明确地使用PHP键入内容,请从以下列表中查看:

默认值 默认情况下,如果可能,PHP会将错误类型的值强制为预期的标量类型。 例如,为期望字符串的参数指定整数的函数将获得字符串类型的变量

严格模式 可以基于每个文件启用严格模式。在严格模式下,只接受类型声明的确切类型的变量,或者抛出TypeError。 此规则的唯一例外是,可能会给期望浮点的函数一个整数。 来自内部函数的函数调用将不受严格类型声明的影响

要启用严格模式,
declare
语句与严格类型声明一起使用:

<?php
declare(strict_types=1); // strict type declaration MUST be the very first statement in your script

function sum(int $a, int $b) {
    return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));
?>

输出

int(3)

致命错误:未捕获的TypeError:传递给sum()的参数1必须是给定的整型浮点型

注意:启用严格模式也会影响


因为PHP进行隐式类型转换,所以不需要它。这是“品味”的问题。字符串提供了更多的控制,因为它们可以被强制转换为所需的类型。否。但是你的同事会希望你这样做。
<?php
declare(strict_types=1); // strict type declaration MUST be the very first statement in your script

function sum(int $a, int $b) {
    return $a + $b;
}

var_dump(sum(1, 2));
var_dump(sum(1.5, 2.5));
?>