没有混合变量的函数调用有什么优点?
What are the advantages of function calls without mixed variables?
我知道 PHP 是一种非常容错的语言,我想这就是为什么您可以使用 mixed variables 来进行函数调用的原因,例如:
/**
* @param mixed $bar
**/
function foo($bar) {
// Do something with $bar, but check it's type!
}
是否有推荐的方法不使用这种混合变量?
对于我自己的项目,我尽量避免这种混合变量,只是为了减少以后出现错误的问题以及代码的清晰度。
并且使用 PHP 7,应该可以声明此函数期望的变量类型,不是吗?这是怎么做到的?
这可能很快就会成为一个意见问题,但是,我觉得松散的类型会引入更多出现错误的可能性。可能在某些情况下它是合适的,但一般来说,对于需要可靠和可维护的代码(可能在 "flexible" 以上),严格类型更安全。
PHP 5 有 "type hinting":
从 PHP 5.0 开始,您可以使用 class 或接口名称作为类型提示,或者 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 为 functions/closures 添加了 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,允许你指定一个函数的类型returns。这个函数必须return一个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)。
这可能会因为 "based on opinion" 而结束,但这仍然是一个很好的问题。
一个函数应该做一件事。如果您需要这样做:
if it's a string
do this
else if it's a Foo object
do this other thing
那么它不止做一件事情,就是"less than ideal"形式。
为什么不直接提供两个名称明确的方法,例如:getThingById(int)
和 getThingByFilters(Filters)
或 getThingLike(string)
等?它也会使您的代码更具可读性和可预测性。
我知道 PHP 是一种非常容错的语言,我想这就是为什么您可以使用 mixed variables 来进行函数调用的原因,例如:
/**
* @param mixed $bar
**/
function foo($bar) {
// Do something with $bar, but check it's type!
}
是否有推荐的方法不使用这种混合变量?
对于我自己的项目,我尽量避免这种混合变量,只是为了减少以后出现错误的问题以及代码的清晰度。
并且使用 PHP 7,应该可以声明此函数期望的变量类型,不是吗?这是怎么做到的?
这可能很快就会成为一个意见问题,但是,我觉得松散的类型会引入更多出现错误的可能性。可能在某些情况下它是合适的,但一般来说,对于需要可靠和可维护的代码(可能在 "flexible" 以上),严格类型更安全。
PHP 5 有 "type hinting":
从 PHP 5.0 开始,您可以使用 class 或接口名称作为类型提示,或者 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 为 functions/closures 添加了 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,允许你指定一个函数的类型returns。这个函数必须return一个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)。
这可能会因为 "based on opinion" 而结束,但这仍然是一个很好的问题。
一个函数应该做一件事。如果您需要这样做:
if it's a string
do this
else if it's a Foo object
do this other thing
那么它不止做一件事情,就是"less than ideal"形式。
为什么不直接提供两个名称明确的方法,例如:getThingById(int)
和 getThingByFilters(Filters)
或 getThingLike(string)
等?它也会使您的代码更具可读性和可预测性。