我知道PHP是一种非常容错的语言,我想这就是为什么你可以mixed variables进行函数调用的原因,如:
/**
* @param mixed $bar
**/
function foo($bar) {
// Do something with $bar, but check it's type!
}
NOT 是否推荐使用此类混合变量?
对于我自己的项目,我尝试避免使用这些混合变量,以便稍后减少错误问题并提高代码清晰度。
使用PHP 7,应该可以声明这个函数期望的变量类型,不应该吗?这是怎么做到的?
答案 0 :(得分:2)
这很快就会成为一个意见问题,但是,我觉得松散的打字会为错误带来更多可能性。在某些情况下,它可能是合适的,但一般来说,对于需要可靠和可维护的代码(可能高于"灵活"),严格的打字更安全。
PHP 5有"类型提示":
从PHP 5.0开始,您可以使用类或接口名称作为类型提示,或self
:
<?php
function testFunction(User $user) {
// `$user` must be a User() object.
}
从PHP 5.1起,您还可以使用array
作为类型提示:
<?php
function getSortedArray(array $array) {
// $user must be an array
}
PHP 5.4为函数/闭包添加了callable
。
<?php
function openWithCallback(callable $callback) {
// $callback must be an callable/function
}
从PHP 7.0开始,也可以使用标量类型(int
,string
,bool
,float
):
<?php
function addToLedger(string $item, int $quantity, bool $confirmed, float $price) {
...
}
从PHP 7开始,现在称为Type Declaration。
PHP 7还引入了Return Type Declarations,允许您指定函数返回的类型。此函数必须返回float
:
<?php
function sum($a, $b): float {
return $a + $b;
}
如果您不使用PHP7,则可以使用可用的类型提示,并使用正确的PHPDoc documentation填充剩余的空白:
<?php
/**
* Generates a random string of the specified length, composed of upper-
* and lower-case letters and numbers.
*
* @param int $length Number of characters to return.
* @return string Random string of $length characters.
*/
public function generateRandomString($length)
{
// ...
return $randomString;
}
许多编辑可以解析这些评论并警告您不正确的输入(例如PHPStorm)。
答案 1 :(得分:2)
这可能会因为“基于意见”而被关闭,但这仍然是一个很好的问题。
一个功能应该做一件事。如果您需要这样做:
if it's a string
do this
else if it's a Foo object
do this other thing
然后它做了不止一件事,这是“不太理想”的形式。
为什么不提供两个命名良好的方法,例如:getThingById(int)
和getThingByFilters(Filters)
或getThingLike(string)
等?它还会使您的代码更具可读性和可预测性。