我正在重构一个广泛的代码库加班。从长远来看,我们将在课堂上开发整个系统,但与此同时,我正在利用这个机会来优化我的PHP技能并改进我们在几百个网站中使用的一些遗留代码。
我一直在阅读有关如何最好地从自定义函数返回数据的相互矛盾的文章,通常争论分为两类,即关注最佳技术实践的那些以及关注易于阅读和演示的那些。
我对从自定义PHP函数返回时您认为最佳实践的观点(详细说明)感兴趣。
我未决定以下哪一项作为使用这一基本理论功能的更好标准;例如
接近a。
填充返回变量并在函数末尾返回它:
<?php
function theoreticalFunction( $var )
{
$return = '';
if( $something > $somethingelse ){
$return = true;
}else{
$return = false;
}
return $return;
}
?>
接近b。
在每个端点返回:
<?php
function theoreticalFunction( $var )
{
if( $something > $somethingelse ){
return true;
}else{
return false;
}
}
?>
可能的重复可能是What is the PHP best practice for using functions that return true or false?但是,尽管我上面的基本示例,这并不仅限于真或假。
我已经查看了PSR指南,但没有看到任何内容(但我可能已经错过了所以请随时将我指向PSR并参考:))。
扩展原始问题:
根据预期/期望的输出类型,用于返回的方法是否不同?
此方法是否会根据过程或面向对象编程方法的使用而改变?正如这个问题所示,面向对象带来了自己的怪癖,以进一步扩展可能的格式/表示选项Best practices for returns methods in PHP
请尽量在您的解释中明确,我感兴趣的是您为什么选择自己喜欢的方法,以及如果有的话,让您选择其他方法。
答案 0 :(得分:5)
我倾向于提前退货 - 只要你知道发生了什么就离开这个功能。如果称为“Guard Clause”
,则使用此类用法我经常会做的其他事情包括删除最终else
作为默认值:
if ($something > $somethingelse) {
return true;
}
return false;
事实上,if (boolean) return true; else return false
形式的条件可以进一步缩短(如果对你来说更清楚)到return ($something > $somethingelse);
。从像这样的代码中提取复杂的if子句到一个有用的命名函数可以帮助清除代码的含义。
答案 1 :(得分:3)
有些人在功能中争论单一退出点(最后只有一个return
),而其他人主张失败/早退。它只是个案意见和可读性/可理解性的问题。几乎没有客观的技术答案。
现实情况是,它不是可以教条地规定的东西。有些算法更好地表示为A,其他算法更好地表现为B.
在您的具体情况下,&#34;最好&#34 ;;您的代码应写为:
return $something > $somethingelse;
希望这可以作为一个例子,说明根本没有普遍适用的规则。
答案 2 :(得分:1)
我知道这个问题已经过时了,但根据我的说法,它很有趣 关于它有很多话要说 首先要说的是,关于函数或方法的返回没有真正的标准 它通常由你的团队决定遵循的规则来统治,但如果你是这个重构的唯一一个,你可以做你想的更好。
在返回值的情况下,我猜是重要的事情 的可读性即可。有时松散一点也好 代码的性能,更易读和可维护 我将尝试展示一些有利有弊的例子。
<?php
function getTariableType($var = null)
{
if (null === $var) {
return 0;
} elseif (is_string($var)) {
return 1;
} else {
return -1;
}
}
<强>优点:强>
<强>缺点:强>
if..else
使代码难以阅读和
我们真的要注意每一个要理解的部分。else
语句不是必需的,代码也是如此
如果return -1
只是函数的最后一个语句,则更容易阅读
在任何else
之外。<?php
function isTheVariableNull($var)
{
return (null === $var);
}
<强>优点:强>
<强>缺点:强>
<?php
function doingSomethingIfNotNullAndPositive($var)
{
if (null !== $var) {
if (0 < $var) {
//Doing something
} else {
return 0;
}
} else {
return -1;
}
}
<强>优点:强>
<强>缺点:强>
if..else
语句时,代码实际上更少
可读。然后,代码缩进很多次看起来很脏。想象一下代码
六个嵌套if
。if..else
嵌套,可能是因为您
应该创建第二个功能。例如,NetBeans IDE建议您创建
另一个处理所有嵌套块逻辑的函数。一个功能
应该是原子,它应该只做一件事。如果它做了太多的工作,有
太多的逻辑,很难维护和理解。创建其他功能
可能是个不错的选择。这个approch旨在提供C.1表示法的替代方案。
<?php
function doingSomethingIfNotNullAndPositive($var)
{
if (null === $var) {
return -1;
} elseif (0 >= $var) {
return 0;
}
//Doing something
}
<强>优点:强>
<强>缺点:强>
<?php
function kindOfStrlen($var)
{
$return = -1;
if (is_string($var)) {
$return = strlen($var);
}
return $return;
}
<强>优点:强>
if
,这很容易,但事实并非如此
改变功能的结构。<强>常数:强>
$return
变量不是必需的,我们
会在不使用它的情况下编写相同的函数。解决方案是
最后return -1
,并在if中返回strlen($var)
,但不会
不太可读。我没有在这里列出所有可能的符号,只列出其中的一些。我们能做什么 想想他们是没有完美的,但在某些情况下似乎有一种方法 比另一个更好。例如, is_null 函数可以正常使用 接近B.
使用方法或其他方法取决于您,重要的是要做到 选择一个逻辑并在你的所有项目中保留它。
答案 3 :(得分:0)
使用方法b对我来说更好,因为在方法中你已经编写了很少的代码行,但如果有很多代码行和很多返回语句,那么我有可能在某处使用错误的返回类型,$ return被分配了一些其他地方,我没有注意到。
答案 4 :(得分:0)
我预先变种b。它不仅更具可读性(您确切地知道在return
语句之后您不需要考虑任何剩余的代码),但它也更加安全。
如果您在其余代码中遇到错误,或者遇到一组在设计系统时未考虑的条件,则可能会更改结果。使用return [$someVariable]
退出函数时,不会发生这种情况;
答案 5 :(得分:0)
<?php
function theoreticalFunction( $var )
{
if( $something > $somethingelse ){
return true;
}
return false;
}
?>
这种方法也可以用作RETURN语句,程序游标返回,下一个语句不会被执行。